diff --git a/.hgignore b/.hgignore
index 501f9e6abe6fbe80f07c8688e75e09f855c29104..b3670902270feeb9c8db67c0079228467b59722d 100644
--- a/.hgignore
+++ b/.hgignore
@@ -25,6 +25,7 @@ indra/lib/mono/indra/*.exe
 indra/lib/mono/indra/*.pdb
 indra/lib/python/eventlet/
 indra/llwindow/glh/glh_linear.h
+indra/newview/app_settings/dictionaries
 indra/newview/app_settings/mozilla
 indra/newview/app_settings/mozilla-runtime-*
 indra/newview/app_settings/mozilla_debug
diff --git a/.hgtags b/.hgtags
index 35028b2807eaf5a92fadf77c699b937f191215b0..6bc059d2fb93984886302198e2bfb542b940d6e9 100644
--- a/.hgtags
+++ b/.hgtags
@@ -301,6 +301,7 @@ c623bbc854b6f7ee1b33a3718f76715046aa2937 viewer-release-candidate
 675668bd24d3bea570814f71762a2a806f7e1b8d viewer-release-candidate
 675668bd24d3bea570814f71762a2a806f7e1b8d 3.3.2-release
 675668bd24d3bea570814f71762a2a806f7e1b8d viewer-release-candidate
+050e48759337249130f684b4a21080b683f61732 DRTVWR-168
 b9d0170b62eb1c7c3adaa37a0b13a833e5e659f9 DRTVWR-171
 c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163
 600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162
diff --git a/BuildParams b/BuildParams
index fc5dbdfbd6e8a47d8d06b7d250a70f9542aea11c..3dd35c5863324903337ddd6a518b111e3bf51e4d 100644
--- a/BuildParams
+++ b/BuildParams
@@ -149,6 +149,10 @@ oz_viewer-beta-review.viewer_channel = "Second Life Beta Viewer"
 oz_viewer-beta-review.login_channel = "Second Life Beta Viewer"
 oz_viewer-beta-review.email = oz@lindenlab.com
 
+oz_project-7.build_debug_release_separately = true
+oz_project-7.codeticket_add_context = false
+oz_project-7.email = "sldev@catznip.com oz@lindenlab.com"
+
 # =================================================================
 # asset delivery 2010 projects
 # =================================================================
diff --git a/autobuild.xml b/autobuild.xml
index ba57d09f86f2b723c003ebc81807d2e7f0cb2bfb..9b564ddefce9fdea8e1122531f0e3b668160e073 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -363,6 +363,54 @@
           </map>
         </map>
       </map>
+      <key>dictionaries</key>
+      <map>
+        <key>license</key>
+        <string>various open</string>
+        <key>license_file</key>
+        <string>LICENSES/dictionaries.txt</string>
+        <key>name</key>
+        <string>dictionaries</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>06a6c49eb1873e95623d3d2d07aee903</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-dictionaries/rev/259873/arch/Darwin/installer/dictionaries-1-darwin-20120616.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>4f0ca21d27e0cd0b002149062b0a4b25</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-dictionaries/rev/259873/arch/Linux/installer/dictionaries-1-linux-20120616.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>7520d75f6af325328322201c888191d4</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-dictionaries/rev/259873/arch/CYGWIN/installer/dictionaries-1-windows-20120616.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
       <key>elfio</key>
       <map>
         <key>license</key>
@@ -999,6 +1047,54 @@
           </map>
         </map>
       </map>
+      <key>libhunspell</key>
+      <map>
+        <key>license</key>
+        <string>libhunspell</string>
+        <key>license_file</key>
+        <string>LICENSES/hunspell.txt</string>
+        <key>name</key>
+        <string>libhunspell</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>6f5db0ef258df6e5c93c843ec559db6d</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-hunspell/rev/259874/arch/Darwin/installer/libhunspell-1.3.2-darwin-20120616.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>0c432d2626aea2e91a56335879c92965</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-hunspell/rev/259874/arch/Linux/installer/libhunspell-1.3.2-linux-20120616.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>6a140e5620826aa5e587b4157f57b389</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-hunspell/rev/259874/arch/CYGWIN/installer/libhunspell-1.3.2-windows-20120616.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
       <key>libpng</key>
       <map>
         <key>license</key>
@@ -1099,8 +1195,6 @@
       <map>
         <key>license</key>
         <string>havok</string>
-        <key>license_file</key>
-        <string>on_file</string>
         <key>name</key>
         <string>llconvexdecomposition</string>
         <key>platforms</key>
@@ -1762,8 +1856,12 @@
     </map>
     <key>package_description</key>
     <map>
+      <key>description</key>
+      <string>Spell checking dictionaries</string>
+      <key>license</key>
+      <string>various open</string>
       <key>name</key>
-      <string>viewer_development</string>
+      <string>dictionaries</string>
       <key>platforms</key>
       <map>
         <key>common</key>
@@ -2473,6 +2571,8 @@
           <string>windows</string>
         </map>
       </map>
+      <key>version</key>
+      <string>1.0</string>
     </map>
     <key>type</key>
     <string>autobuild</string>
diff --git a/build.sh b/build.sh
index 8ca3208087f6a4729a1f8a991e86f08832a40a26..a95ca91d82970997e753c61437ce948b277a31ee 100755
--- a/build.sh
+++ b/build.sh
@@ -15,6 +15,12 @@
 # * The basic convention is that the build name can be mapped onto a mercurial URL,
 #   which is also used as the "branch" name.
 
+check_for()
+{
+    if [ -e "$2" ]; then found_dict='FOUND'; else found_dict='MISSING'; fi
+    echo "$1 ${found_dict} '$2' " 1>&2
+}
+
 build_dir_Darwin()
 {
   echo build-darwin-i386
@@ -59,6 +65,8 @@ pre_build()
     && [ -r "$master_message_template_checkout/message_template.msg" ] \
     && template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg"
 
+    check_for "Before 'autobuild configure'" ${build_dir}/packages/dictionaries
+
     "$AUTOBUILD" configure -c $variant -- \
      -DPACKAGE:BOOL=ON \
      -DRELEASE_CRASH_REPORTING:BOOL=ON \
@@ -67,7 +75,10 @@ pre_build()
      -DGRID:STRING="\"$viewer_grid\"" \
      -DLL_TESTS:BOOL="$run_tests" \
      -DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url
- end_section "Pre$variant"
+
+    check_for "After 'autobuild configure'" ${build_dir}/packages/dictionaries
+
+  end_section "Pre$variant"
 }
 
 build()
@@ -76,12 +87,17 @@ build()
   if $build_viewer
   then
     begin_section "Viewer$variant"
+
+    check_for "Before 'autobuild build'" ${build_dir}/packages/dictionaries
+
     if "$AUTOBUILD" build --no-configure -c $variant
     then
       echo true >"$build_dir"/build_ok
     else
       echo false >"$build_dir"/build_ok
     fi
+    check_for "After 'autobuild configure'" ${build_dir}/packages/dictionaries
+
     end_section "Viewer$variant"
   fi
 }
@@ -172,7 +188,10 @@ eval "$("$AUTOBUILD" source_environment)"
 # dump environment variables for debugging
 env|sort
 
+check_for "Before 'autobuild install'" ${build_dir}/packages/dictionaries
+
 
+check_for "After 'autobuild install'" ${build_dir}/packages/dictionaries
 # Now run the build
 succeeded=true
 build_processes=
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 25c0227d157b866e436bd8e9bd42f62a3a9995d1..df504e4a8a544ed726b7caa24259e1f4d482c71f 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -1067,6 +1067,8 @@ Simon Nolan
 Sini Nubalo
 Sitearm Madonna
 SLB Wirefly
+Slee Mayo
+    SEC-1075
 snowy Sidran
 SpacedOut Frye
 	VWR-34
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index 279d577a278a805f06442f2ba63bf580eadbed59..9b836aac5fb2772d93136b9d7d6ef13bb6518a4e 100644
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -37,6 +37,7 @@ set(cmake_SOURCE_FILES
     GLOD.cmake
     GStreamer010Plugin.cmake
     GooglePerfTools.cmake
+    Hunspell.cmake
     JPEG.cmake
     LLAddBuildTest.cmake
     LLAudio.cmake
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 394db362b1572414e80578e5f433589b6b2b9f77..224e0a8b5163a32b4efbfd941113dcc0402ef12b 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -41,6 +41,7 @@ if(WINDOWS)
         libeay32.dll
         libcollada14dom22-d.dll
         glod.dll    
+        libhunspell.dll
         )
 
     set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
@@ -53,6 +54,7 @@ if(WINDOWS)
         libeay32.dll
         libcollada14dom22.dll
         glod.dll
+        libhunspell.dll
         )
 
     if(USE_GOOGLE_PERFTOOLS)
@@ -212,11 +214,12 @@ elseif(DARWIN)
         libexpat.1.5.2.dylib
         libexpat.dylib
         libGLOD.dylib
-    libllqtwebkit.dylib
-    libminizip.a
+        libllqtwebkit.dylib
+        libminizip.a
         libndofdev.dylib
+        libhunspell-1.3.0.dylib
         libexception_handler.dylib
-    libcollada14dom.dylib
+        libcollada14dom.dylib
        )
 
     # fmod is statically linked on darwin
@@ -257,14 +260,15 @@ elseif(LINUX)
         libdb-5.1.so
         libexpat.so
         libexpat.so.1
-    libglod.so
+        libglod.so
         libgmock_main.so
         libgmock.so.0
         libgmodule-2.0.so
         libgobject-2.0.so
         libgtest_main.so
         libgtest.so.0
-    libminizip.so
+        libhunspell-1.3.so.0.0.0
+        libminizip.so
         libopenal.so
         libopenjpeg.so
         libssl.so
diff --git a/indra/cmake/FindHUNSPELL.cmake b/indra/cmake/FindHUNSPELL.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..6faf22959c65ab189f5c10e3b3afdfaba00bd973
--- /dev/null
+++ b/indra/cmake/FindHUNSPELL.cmake
@@ -0,0 +1,38 @@
+# -*- cmake -*-
+
+# - Find HUNSPELL
+# This module defines
+#  HUNSPELL_INCLUDE_DIR, where to find libhunspell.h, etc.
+#  HUNSPELL_LIBRARY, the library needed to use HUNSPELL.
+#  HUNSPELL_FOUND, If false, do not try to use HUNSPELL.
+
+find_path(HUNSPELL_INCLUDE_DIR hunspell.h
+  PATH_SUFFIXES hunspell
+  )
+
+set(HUNSPELL_NAMES ${HUNSPELL_NAMES} libhunspell-1.3.0 libhunspell)
+find_library(HUNSPELL_LIBRARY
+  NAMES ${HUNSPELL_NAMES}
+  )
+
+if (HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR)
+  set(HUNSPELL_FOUND "YES")
+else (HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR)
+  set(HUNSPELL_FOUND "NO")
+endif (HUNSPELL_LIBRARY AND HUNSPELL_INCLUDE_DIR)
+
+
+if (HUNSPELL_FOUND)
+  if (NOT HUNSPELL_FIND_QUIETLY)
+    message(STATUS "Found Hunspell: Library in '${HUNSPELL_LIBRARY}' and header in '${HUNSPELL_INCLUDE_DIR}' ")
+  endif (NOT HUNSPELL_FIND_QUIETLY)
+else (HUNSPELL_FOUND)
+  if (HUNSPELL_FIND_REQUIRED)
+    message(FATAL_ERROR " * * *\nCould not find HUNSPELL library! * * *")
+  endif (HUNSPELL_FIND_REQUIRED)
+endif (HUNSPELL_FOUND)
+
+mark_as_advanced(
+  HUNSPELL_LIBRARY
+  HUNSPELL_INCLUDE_DIR
+  )
diff --git a/indra/cmake/Hunspell.cmake b/indra/cmake/Hunspell.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..0c9cf933161c5efab2c787c877bf069fd838f6a4
--- /dev/null
+++ b/indra/cmake/Hunspell.cmake
@@ -0,0 +1,22 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+set(HUNSPELL_FIND_QUIETLY ON)
+set(HUNSPELL_FIND_REQUIRED ON)
+
+if (STANDALONE)
+  include(FindHUNSPELL)
+else (STANDALONE)
+  use_prebuilt_binary(libhunspell)
+  if (WINDOWS)
+    set(HUNSPELL_LIBRARY libhunspell)
+  elseif(DARWIN)
+    set(HUNSPELL_LIBRARY hunspell-1.3.0)
+  elseif(LINUX)
+    set(HUNSPELL_LIBRARY hunspell-1.3)
+  else()
+    message(FATAL_ERROR "Invalid platform")
+  endif()
+  set(HUNSPELL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/hunspell)
+  use_prebuilt_binary(dictionaries)
+endif (STANDALONE)
diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake
index df013b1665058e458ede89172c2aa5281ea480a5..f907181929802ab0a27019b574a3ddab7d4e1794 100644
--- a/indra/cmake/ViewerMiscLibs.cmake
+++ b/indra/cmake/ViewerMiscLibs.cmake
@@ -2,6 +2,7 @@
 include(Prebuilt)
 
 if (NOT STANDALONE)
+  use_prebuilt_binary(libhunspell)
   use_prebuilt_binary(libuuid)
   use_prebuilt_binary(slvoice)
   use_prebuilt_binary(fontconfig)
diff --git a/indra/integration_tests/llui_libtest/CMakeLists.txt b/indra/integration_tests/llui_libtest/CMakeLists.txt
index 633ad84159e68403bdc123152dd50509ecf851e6..91c9f20c107f51f4e6c54a29d7a4fdb3db4765d6 100644
--- a/indra/integration_tests/llui_libtest/CMakeLists.txt
+++ b/indra/integration_tests/llui_libtest/CMakeLists.txt
@@ -18,6 +18,7 @@ include(LLWindow)
 include(LLUI)
 include(LLVFS)        # ugh, needed for LLDir
 include(LLXML)
+include(Hunspell)
 include(Linking)
 # include(Tut)
 
@@ -31,6 +32,7 @@ include_directories(
     ${LLVFS_INCLUDE_DIRS}
     ${LLWINDOW_INCLUDE_DIRS}
     ${LLXML_INCLUDE_DIRS}
+    ${LIBS_PREBUILD_DIR}/include/hunspell
     )
 
 set(llui_libtest_SOURCE_FILES
@@ -78,6 +80,7 @@ target_link_libraries(llui_libtest
     ${LLIMAGEJ2COJ_LIBRARIES}
     ${OS_LIBRARIES}
     ${GOOGLE_PERFTOOLS_LIBRARIES}
+    ${HUNSPELL_LIBRARY}
     )
 
 if (WINDOWS)
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 09733e8e2a16cb3d8eb0b11175f9a89b84282b61..119efc795755ced045686dd04edab1387ac42260 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -183,6 +183,9 @@ public:
 	static bool isPunct(char a) { return ispunct((unsigned char)a) != 0; }
 	static bool isPunct(llwchar a) { return iswpunct(a) != 0; }
 
+	static bool isAlpha(char a) { return isalpha((unsigned char)a) != 0; }
+	static bool isAlpha(llwchar a) { return iswalpha(a) != 0; }
+
 	static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; }
 	static bool isAlnum(llwchar a) { return iswalnum(a) != 0; }
 
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index fccbf37a8dd407f0a37c093ab931f977ef106d88..4dc2fcd7146d9e3f60474dcf803f2402de93acc7 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -422,6 +422,16 @@ S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y
 }
 
 // font metrics - override for LLFontFreetype that returns units of virtual pixels
+F32 LLFontGL::getAscenderHeight() const
+{ 
+	return mFontFreetype->getAscenderHeight() / sScaleY;
+}
+
+F32 LLFontGL::getDescenderHeight() const
+{ 
+	return mFontFreetype->getDescenderHeight() / sScaleY;
+}
+
 S32 LLFontGL::getLineHeight() const
 { 
 	return llceil(mFontFreetype->getAscenderHeight() / sScaleY) + llceil(mFontFreetype->getDescenderHeight() / sScaleY);
diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h
index 74bdbb43e7424497820c08353b7125e81295ba3f..5ed5d2c4ebe1bce1f51656a5a5f10b8fbdf3371b 100644
--- a/indra/llrender/llfontgl.h
+++ b/indra/llrender/llfontgl.h
@@ -115,6 +115,8 @@ public:
 	S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style = NORMAL, ShadowType shadow = NO_SHADOW) const;
 
 	// font metrics - override for LLFontFreetype that returns units of virtual pixels
+	F32 getAscenderHeight() const;
+	F32 getDescenderHeight() const;
 	S32 getLineHeight() const;
 
 	S32 getWidth(const std::string& utf8text) const;
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 20c3456a56a816ac3fda9c3edf0eb17fdefc033d..cca4ca3981097173483121f310e906354184d1f6 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -23,6 +23,7 @@ include_directories(
     ${LLWINDOW_INCLUDE_DIRS}
     ${LLVFS_INCLUDE_DIRS}
     ${LLXML_INCLUDE_DIRS}
+    ${LIBS_PREBUILD_DIR}/include/hunspell
     )
 
 set(llui_SOURCE_FILES
@@ -84,6 +85,7 @@ set(llui_SOURCE_FILES
     llsearcheditor.cpp
     llslider.cpp
     llsliderctrl.cpp
+    llspellcheck.cpp
     llspinctrl.cpp
     llstatbar.cpp
     llstatgraph.cpp
@@ -191,6 +193,8 @@ set(llui_HEADER_FILES
     llscrolllistitem.h
     llsliderctrl.h
     llslider.h
+    llspellcheck.h
+    llspellcheckmenuhandler.h
     llspinctrl.h
     llstatbar.h
     llstatgraph.h
@@ -260,6 +264,7 @@ target_link_libraries(llui
     ${LLXUIXML_LIBRARIES}
     ${LLXML_LIBRARIES}
     ${LLMATH_LIBRARIES}
+    ${HUNSPELL_LIBRARY}
     ${LLCOMMON_LIBRARIES} # must be after llimage, llwindow, llrender
     )
 
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index d0fbf4b91370d6c7f46c2e3addb9306cca2cbaa5..48d49af58810e4e4eccc3a73072ddd2821a431ae 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -45,6 +45,7 @@
 #include "llkeyboard.h"
 #include "llrect.h"
 #include "llresmgr.h"
+#include "llspellcheck.h"
 #include "llstring.h"
 #include "llwindow.h"
 #include "llui.h"
@@ -65,6 +66,7 @@ const S32	SCROLL_INCREMENT_ADD = 0;	// make space for typing
 const S32   SCROLL_INCREMENT_DEL = 4;	// make space for baskspacing
 const F32   AUTO_SCROLL_TIME = 0.05f;
 const F32	TRIPLE_CLICK_INTERVAL = 0.3f;	// delay between double and triple click. *TODO: make this equal to the double click interval?
+const F32	SPELLCHECK_DELAY = 0.5f;	// delay between the last keypress and spell checking the word the cursor is on
 
 const std::string PASSWORD_ASTERISK( "\xE2\x80\xA2" ); // U+2022 BULLET
 
@@ -88,6 +90,7 @@ LLLineEditor::Params::Params()
 	background_image_focused("background_image_focused"),
 	select_on_focus("select_on_focus", false),
 	revert_on_esc("revert_on_esc", true),
+	spellcheck("spellcheck", false),
 	commit_on_focus_lost("commit_on_focus_lost", true),
 	ignore_tab("ignore_tab", true),
 	is_password("is_password", false),
@@ -134,6 +137,9 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
 	mIgnoreArrowKeys( FALSE ),
 	mIgnoreTab( p.ignore_tab ),
 	mDrawAsterixes( p.is_password ),
+	mSpellCheck( p.spellcheck ),
+	mSpellCheckStart(-1),
+	mSpellCheckEnd(-1),
 	mSelectAllonFocusReceived( p.select_on_focus ),
 	mSelectAllonCommit( TRUE ),
 	mPassDelete(FALSE),
@@ -151,7 +157,8 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
 	mHighlightColor(p.highlight_color()),
 	mPreeditBgColor(p.preedit_bg_color()),
 	mGLFont(p.font),
-	mContextMenuHandle()
+	mContextMenuHandle(),
+	mAutoreplaceCallback()
 {
 	llassert( mMaxLengthBytes > 0 );
 
@@ -177,6 +184,12 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
 	updateTextPadding();
 	setCursor(mText.length());
 
+	if (mSpellCheck)
+	{
+		LLSpellChecker::setSettingsChangeCallback(boost::bind(&LLLineEditor::onSpellCheckSettingsChange, this));
+	}
+	mSpellCheckTimer.reset();
+
 	setPrevalidateInput(p.prevalidate_input_callback());
 	setPrevalidate(p.prevalidate_callback());
 
@@ -195,7 +208,6 @@ LLLineEditor::~LLLineEditor()
 	gFocusMgr.releaseFocusIfNeeded( this );
 }
 
-
 void LLLineEditor::onFocusReceived()
 {
 	gEditMenuHandler = this;
@@ -519,6 +531,99 @@ void LLLineEditor::selectAll()
 	updatePrimary();
 }
 
+bool LLLineEditor::getSpellCheck() const
+{
+	return (LLSpellChecker::getUseSpellCheck()) && (!mReadOnly) && (mSpellCheck);
+}
+
+const std::string& LLLineEditor::getSuggestion(U32 index) const
+{
+	return (index < mSuggestionList.size()) ? mSuggestionList[index] : LLStringUtil::null;
+}
+
+U32 LLLineEditor::getSuggestionCount() const
+{
+	return mSuggestionList.size();
+}
+
+void LLLineEditor::replaceWithSuggestion(U32 index)
+{
+	for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+	{
+		if ( (it->first <= (U32)mCursorPos) && (it->second >= (U32)mCursorPos) )
+		{
+			deselect();
+
+			// Delete the misspelled word
+			mText.erase(it->first, it->second - it->first);
+
+			// Insert the suggestion in its place
+			LLWString suggestion = utf8str_to_wstring(mSuggestionList[index]);
+			mText.insert(it->first, suggestion);
+			setCursor(it->first + (S32)suggestion.length());
+
+			break;
+		}
+	}
+	mSpellCheckStart = mSpellCheckEnd = -1;
+}
+
+void LLLineEditor::addToDictionary()
+{
+	if (canAddToDictionary())
+	{
+		LLSpellChecker::instance().addToCustomDictionary(getMisspelledWord(mCursorPos));
+	}
+}
+
+bool LLLineEditor::canAddToDictionary() const
+{
+	return (getSpellCheck()) && (isMisspelledWord(mCursorPos));
+}
+
+void LLLineEditor::addToIgnore()
+{
+	if (canAddToIgnore())
+	{
+		LLSpellChecker::instance().addToIgnoreList(getMisspelledWord(mCursorPos));
+	}
+}
+
+bool LLLineEditor::canAddToIgnore() const
+{
+	return (getSpellCheck()) && (isMisspelledWord(mCursorPos));
+}
+
+std::string LLLineEditor::getMisspelledWord(U32 pos) const
+{
+	for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+	{
+		if ( (it->first <= pos) && (it->second >= pos) )
+		{
+			return wstring_to_utf8str(mText.getWString().substr(it->first, it->second - it->first));
+		}
+	}
+	return LLStringUtil::null;
+}
+
+bool LLLineEditor::isMisspelledWord(U32 pos) const
+{
+	for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+	{
+		if ( (it->first <= pos) && (it->second >= pos) )
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+void LLLineEditor::onSpellCheckSettingsChange()
+{
+	// Recheck the spelling on every change
+	mMisspellRanges.clear();
+	mSpellCheckStart = mSpellCheckEnd = -1;
+}
 
 BOOL LLLineEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
 {
@@ -866,6 +971,12 @@ void LLLineEditor::addChar(const llwchar uni_char)
 		LLUI::reportBadKeystroke();
 	}
 
+	if (!mReadOnly && mAutoreplaceCallback != NULL)
+	{
+		// call callback
+		mAutoreplaceCallback(mText, mCursorPos);
+	}
+
 	getWindow()->hideCursorUntilMouseMove();
 }
 
@@ -1058,9 +1169,8 @@ void LLLineEditor::cut()
 			LLUI::reportBadKeystroke();
 		}
 		else
-		if( mKeystrokeCallback )
 		{
-			mKeystrokeCallback( this );
+			onKeystroke();
 		}
 	}
 }
@@ -1187,9 +1297,8 @@ void LLLineEditor::pasteHelper(bool is_primary)
 				LLUI::reportBadKeystroke();
 			}
 			else
-			if( mKeystrokeCallback )
 			{
-				mKeystrokeCallback( this );
+				onKeystroke();
 			}
 		}
 	}
@@ -1442,9 +1551,10 @@ BOOL LLLineEditor::handleKeyHere(KEY key, MASK mask )
 			// Notify owner if requested
 			if (!need_to_rollback && handled)
 			{
-				if (mKeystrokeCallback)
+				onKeystroke();
+				if ( (!selection_modified) && (KEY_BACKSPACE == key) )
 				{
-					mKeystrokeCallback(this);
+					mSpellCheckTimer.setTimerExpirySec(SPELLCHECK_DELAY);
 				}
 			}
 		}
@@ -1497,12 +1607,11 @@ BOOL LLLineEditor::handleUnicodeCharHere(llwchar uni_char)
 		// Notify owner if requested
 		if( !need_to_rollback && handled )
 		{
-			if( mKeystrokeCallback )
-			{
-				// HACK! The only usage of this callback doesn't do anything with the character.
-				// We'll have to do something about this if something ever changes! - Doug
-				mKeystrokeCallback( this );
-			}
+			// HACK! The only usage of this callback doesn't do anything with the character.
+			// We'll have to do something about this if something ever changes! - Doug
+			onKeystroke();
+
+			mSpellCheckTimer.setTimerExpirySec(SPELLCHECK_DELAY);
 		}
 	}
 	return handled;
@@ -1531,9 +1640,7 @@ void LLLineEditor::doDelete()
 
 			if (!prevalidateInput(text_to_delete))
 			{
-				if( mKeystrokeCallback )
-					mKeystrokeCallback( this );
-
+				onKeystroke();
 				return;
 			}
 			setCursor(getCursor() + 1);
@@ -1549,10 +1656,9 @@ void LLLineEditor::doDelete()
 		}
 		else
 		{
-			if( mKeystrokeCallback )
-			{
-				mKeystrokeCallback( this );
-			}
+			onKeystroke();
+
+			mSpellCheckTimer.setTimerExpirySec(SPELLCHECK_DELAY);
 		}
 	}
 }
@@ -1624,6 +1730,10 @@ void LLLineEditor::draw()
 	background.stretch( -mBorderThickness );
 
 	S32 lineeditor_v_pad = (background.getHeight() - mGLFont->getLineHeight()) / 2;
+	if (mSpellCheck)
+	{
+		lineeditor_v_pad += 1;
+	}
 
 	drawBackground();
 	
@@ -1698,14 +1808,14 @@ void LLLineEditor::draw()
 	{
 		S32 select_left;
 		S32 select_right;
-		if( mSelectionStart < getCursor() )
+		if (mSelectionStart < mSelectionEnd)
 		{
 			select_left = mSelectionStart;
-			select_right = getCursor();
+			select_right = mSelectionEnd;
 		}
 		else
 		{
-			select_left = getCursor();
+			select_left = mSelectionEnd;
 			select_right = mSelectionStart;
 		}
 		
@@ -1749,7 +1859,7 @@ void LLLineEditor::draw()
 		if( (rendered_pixels_right < (F32)mTextRightEdge) && (rendered_text < text_len) )
 		{
 			// unselected, right side
-			mGLFont->render( 
+			rendered_text += mGLFont->render( 
 				mText, mScrollHPos + rendered_text,
 				rendered_pixels_right, text_bottom,
 				text_color,
@@ -1763,7 +1873,7 @@ void LLLineEditor::draw()
 	}
 	else
 	{
-		mGLFont->render( 
+		rendered_text = mGLFont->render( 
 			mText, mScrollHPos, 
 			rendered_pixels_right, text_bottom,
 			text_color,
@@ -1778,6 +1888,101 @@ void LLLineEditor::draw()
 	mBorder->setVisible(FALSE); // no more programmatic art.
 #endif
 
+	if ( (getSpellCheck()) && (mText.length() > 2) )
+	{
+		// Calculate start and end indices for the first and last visible word
+		U32 start = prevWordPos(mScrollHPos), end = nextWordPos(mScrollHPos + rendered_text);
+
+		if ( (mSpellCheckStart != start) || (mSpellCheckEnd != end) )
+		{
+			const LLWString& text = mText.getWString().substr(start, end);
+
+			// Find the start of the first word
+			U32 word_start = 0, word_end = 0;
+			while ( (word_start < text.length()) && (!LLStringOps::isAlpha(text[word_start])) )
+			{
+				word_start++;
+			}
+
+			// Iterate over all words in the text block and check them one by one
+			mMisspellRanges.clear();
+			while (word_start < text.length())
+			{
+				// Find the end of the current word (special case handling for "'" when it's used as a contraction)
+				word_end = word_start + 1;
+				while ( (word_end < text.length()) && 
+					    ((LLWStringUtil::isPartOfWord(text[word_end])) ||
+						 ((L'\'' == text[word_end]) && (word_end + 1 < text.length()) &&
+						  (LLStringOps::isAlnum(text[word_end - 1])) && (LLStringOps::isAlnum(text[word_end + 1])))) )
+				{
+					word_end++;
+				}
+				if (word_end > text.length())
+				{
+					break;
+				}
+
+				// Don't process words shorter than 3 characters
+				std::string word = wstring_to_utf8str(text.substr(word_start, word_end - word_start));
+				if ( (word.length() >= 3) && (!LLSpellChecker::instance().checkSpelling(word)) )
+				{
+					mMisspellRanges.push_back(std::pair<U32, U32>(start + word_start, start + word_end));
+				}
+
+				// Find the start of the next word
+				word_start = word_end + 1;
+				while ( (word_start < text.length()) && (!LLWStringUtil::isPartOfWord(text[word_start])) )
+				{
+					word_start++;
+				}
+			}
+
+			mSpellCheckStart = start;
+			mSpellCheckEnd = end;
+		}
+
+		// Draw squiggly lines under any (visible) misspelled words
+		for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+		{
+			// Skip over words that aren't (partially) visible
+			if ( ((it->first < start) && (it->second < start)) || (it->first > end) )
+			{
+				continue;
+			}
+
+			// Skip the current word if the user is still busy editing it
+			if ( (!mSpellCheckTimer.hasExpired()) && (it->first <= (U32)mCursorPos) && (it->second >= (U32)mCursorPos) )
+			{
+ 				continue;
+			}
+
+			S32 pxWidth = getRect().getWidth();
+			S32 pxStart = findPixelNearestPos(it->first - getCursor());
+			if (pxStart > pxWidth)
+			{
+				continue;
+			}
+			S32 pxEnd = findPixelNearestPos(it->second - getCursor());
+			if (pxEnd > pxWidth)
+			{
+				pxEnd = pxWidth;
+			}
+
+			S32 pxBottom = (S32)(text_bottom + mGLFont->getDescenderHeight());
+
+			gGL.color4ub(255, 0, 0, 200);
+			while (pxStart + 1 < pxEnd)
+			{
+				gl_line_2d(pxStart, pxBottom, pxStart + 2, pxBottom - 2);
+				if (pxStart + 3 < pxEnd)
+				{
+					gl_line_2d(pxStart + 2, pxBottom - 3, pxStart + 4, pxBottom - 1);
+				}
+				pxStart += 4;
+			}
+		}
+	}
+
 	// If we're editing...
 	if( hasFocus())
 	{
@@ -2109,6 +2314,15 @@ void LLLineEditor::setSelectAllonFocusReceived(BOOL b)
 	mSelectAllonFocusReceived = b;
 }
 
+void LLLineEditor::onKeystroke()
+{
+	if (mKeystrokeCallback)
+	{
+		mKeystrokeCallback(this);
+	}
+
+	mSpellCheckStart = mSpellCheckEnd = -1;
+}
 
 void LLLineEditor::setKeystrokeCallback(callback_t callback, void* user_data)
 {
@@ -2231,10 +2445,9 @@ void LLLineEditor::updatePreedit(const LLWString &preedit_string,
 
 	// Update of the preedit should be caused by some key strokes.
 	mKeystrokeTimer.reset();
-	if( mKeystrokeCallback )
-	{
-		mKeystrokeCallback( this );
-	}
+	onKeystroke();
+
+	mSpellCheckTimer.setTimerExpirySec(SPELLCHECK_DELAY);
 }
 
 BOOL LLLineEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect *bounds, LLRect *control) const
@@ -2386,7 +2599,38 @@ void LLLineEditor::showContextMenu(S32 x, S32 y)
 
 		S32 screen_x, screen_y;
 		localPointToScreen(x, y, &screen_x, &screen_y);
-		menu->show(screen_x, screen_y);
+
+		setCursorAtLocalPos(x);
+		if (hasSelection())
+		{
+			if ( (mCursorPos < llmin(mSelectionStart, mSelectionEnd)) || (mCursorPos > llmax(mSelectionStart, mSelectionEnd)) )
+			{
+				deselect();
+			}
+			else
+			{
+				setCursor(llmax(mSelectionStart, mSelectionEnd));
+			}
+		}
+
+		bool use_spellcheck = getSpellCheck(), is_misspelled = false;
+		if (use_spellcheck)
+		{
+			mSuggestionList.clear();
+
+			// If the cursor is on a misspelled word, retrieve suggestions for it
+			std::string misspelled_word = getMisspelledWord(mCursorPos);
+			if ((is_misspelled = !misspelled_word.empty()) == true)
+			{
+				LLSpellChecker::instance().getSuggestions(misspelled_word, mSuggestionList);
+			}
+		}
+
+		menu->setItemVisible("Suggestion Separator", (use_spellcheck) && (!mSuggestionList.empty()));
+		menu->setItemVisible("Add to Dictionary", (use_spellcheck) && (is_misspelled));
+		menu->setItemVisible("Add to Ignore", (use_spellcheck) && (is_misspelled));
+		menu->setItemVisible("Spellcheck Separator", (use_spellcheck) && (is_misspelled));
+		menu->show(screen_x, screen_y, this);
 	}
 }
 
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 2518dbe3c73cea0ff101500a39627265cc47b7f5..71dd53f60838a880fa47a1230017d849492a18eb 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -40,6 +40,7 @@
 #include "llframetimer.h"
 
 #include "lleditmenuhandler.h"
+#include "llspellcheckmenuhandler.h"
 #include "lluictrl.h"
 #include "lluiimage.h"
 #include "lluistring.h"
@@ -54,7 +55,7 @@ class LLButton;
 class LLContextMenu;
 
 class LLLineEditor
-: public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor
+: public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor, public LLSpellCheckMenuHandler
 {
 public:
 
@@ -86,6 +87,7 @@ public:
 
 		Optional<bool>					select_on_focus,
 										revert_on_esc,
+										spellcheck,
 										commit_on_focus_lost,
 										ignore_tab,
 										is_password;
@@ -146,6 +148,24 @@ public:
 	virtual void	deselect();
 	virtual BOOL	canDeselect() const;
 
+	// LLSpellCheckMenuHandler overrides
+	/*virtual*/ bool	getSpellCheck() const;
+
+	/*virtual*/ const std::string& getSuggestion(U32 index) const;
+	/*virtual*/ U32		getSuggestionCount() const;
+	/*virtual*/ void	replaceWithSuggestion(U32 index);
+
+	/*virtual*/ void	addToDictionary();
+	/*virtual*/ bool	canAddToDictionary() const;
+
+	/*virtual*/ void	addToIgnore();
+	/*virtual*/ bool	canAddToIgnore() const;
+
+	// Spell checking helper functions
+	std::string			getMisspelledWord(U32 pos) const;
+	bool				isMisspelledWord(U32 pos) const;
+	void				onSpellCheckSettingsChange();
+
 	// view overrides
 	virtual void	draw();
 	virtual void	reshape(S32 width,S32 height,BOOL called_from_parent=TRUE);
@@ -169,6 +189,9 @@ public:
 	virtual BOOL	setTextArg( const std::string& key, const LLStringExplicit& text );
 	virtual BOOL	setLabelArg( const std::string& key, const LLStringExplicit& text );
 
+	typedef boost::function<void(LLUIString&, S32&)> autoreplace_callback_t;
+	autoreplace_callback_t mAutoreplaceCallback;
+	void			setAutoreplaceCallback(autoreplace_callback_t cb) { mAutoreplaceCallback = cb; }
 	void			setLabel(const LLStringExplicit &new_label) { mLabel = new_label; }
 	const std::string& 	getLabel()	{ return mLabel.getString(); }
 
@@ -223,6 +246,7 @@ public:
 	void			setSelectAllonFocusReceived(BOOL b);
 	void			setSelectAllonCommit(BOOL b) { mSelectAllonCommit = b; }
 	
+	void			onKeystroke();
 	typedef boost::function<void (LLLineEditor* caller, void* user_data)> callback_t;
 	void			setKeystrokeCallback(callback_t callback, void* user_data);
 
@@ -322,6 +346,13 @@ protected:
 	S32			mLastSelectionStart;
 	S32			mLastSelectionEnd;
 
+	bool		mSpellCheck;
+	S32			mSpellCheckStart;
+	S32			mSpellCheckEnd;
+	LLTimer		mSpellCheckTimer;
+	std::list<std::pair<U32, U32> > mMisspellRanges;
+	std::vector<std::string>		mSuggestionList;
+
 	LLTextValidate::validate_func_t mPrevalidateFunc;
 	LLTextValidate::validate_func_t mPrevalidateInputFunc;
 
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index ff6928ffda10b9ebf2188483c286338a736d97ba..efb9848a909593c0a2e68fa05744d5371bc6c2d4 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -3854,7 +3854,7 @@ void LLContextMenu::setVisible(BOOL visible)
 }
 
 // Takes cursor position in screen space?
-void LLContextMenu::show(S32 x, S32 y)
+void LLContextMenu::show(S32 x, S32 y, LLView* spawning_view)
 {
 	if (getChildList()->empty())
 	{
@@ -3908,6 +3908,14 @@ void LLContextMenu::show(S32 x, S32 y)
 	setRect(rect);
 	arrange();
 
+	if (spawning_view)
+	{
+		mSpawningViewHandle = spawning_view->getHandle();
+	}
+	else
+	{
+		mSpawningViewHandle.markDead();
+	}
 	LLView::setVisible(TRUE);
 }
 
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 36f3ba34b9b5e45c3271563e0efc7224acbb86fe..67b3e1fbe669587bc41ef47fb58cf9a262395dc1 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -670,7 +670,7 @@ public:
 	
 	virtual void	draw				();
 	
-	virtual void	show				(S32 x, S32 y);
+	virtual void	show				(S32 x, S32 y, LLView* spawning_view = NULL);
 	virtual void	hide				();
 
 	virtual BOOL	handleHover			( S32 x, S32 y, MASK mask );
@@ -683,10 +683,14 @@ public:
 
 			LLHandle<LLContextMenu> getHandle() { return getDerivedHandle<LLContextMenu>(); }
 
+			LLView*	getSpawningView() const		{ return mSpawningViewHandle.get(); }
+			void	setSpawningView(LLHandle<LLView> spawning_view) { mSpawningViewHandle = spawning_view; }
+
 protected:
 	BOOL						mHoveredAnyItem;
 	LLMenuItemGL*				mHoverItem;
 	LLRootHandle<LLContextMenu>	mHandle;
+	LLHandle<LLView>			mSpawningViewHandle;
 };
 
 
diff --git a/indra/llui/llspellcheck.cpp b/indra/llui/llspellcheck.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a189375fbea58d3c2f9a4469c09c8bf0c7bccbf9
--- /dev/null
+++ b/indra/llui/llspellcheck.cpp
@@ -0,0 +1,505 @@
+/** 
+ * @file llspellcheck.cpp
+ * @brief Spell checking functionality
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "lldir.h"
+#include "llsdserialize.h"
+
+#include "llspellcheck.h"
+#if LL_WINDOWS
+	#include <hunspell/hunspelldll.h>
+	#pragma comment(lib, "libhunspell.lib")
+#else
+	#include <hunspell/hunspell.hxx>
+#endif
+
+static const std::string DICT_DIR = "dictionaries";
+static const std::string DICT_FILE_CUSTOM = "user_custom.dic";
+static const std::string DICT_FILE_IGNORE = "user_ignore.dic";
+
+static const std::string DICT_FILE_MAIN = "dictionaries.xml";
+static const std::string DICT_FILE_USER = "user_dictionaries.xml";
+
+LLSD LLSpellChecker::sDictMap;
+LLSpellChecker::settings_change_signal_t LLSpellChecker::sSettingsChangeSignal;
+
+LLSpellChecker::LLSpellChecker()
+	: mHunspell(NULL)
+{
+	// Load initial dictionary information
+	refreshDictionaryMap();
+}
+
+LLSpellChecker::~LLSpellChecker()
+{
+	delete mHunspell;
+}
+
+bool LLSpellChecker::checkSpelling(const std::string& word) const
+{
+	if ( (!mHunspell) || (word.length() < 3) || (0 != mHunspell->spell(word.c_str())) )
+	{
+		return true;
+	}
+	if (mIgnoreList.size() > 0)
+	{
+		std::string word_lower(word);
+		LLStringUtil::toLower(word_lower);
+		return (mIgnoreList.end() != std::find(mIgnoreList.begin(), mIgnoreList.end(), word_lower));
+	}
+	return false;
+}
+
+S32 LLSpellChecker::getSuggestions(const std::string& word, std::vector<std::string>& suggestions) const
+{
+	suggestions.clear();
+	if ( (!mHunspell) || (word.length() < 3) )
+	{
+		return 0;
+	}
+
+	char** suggestion_list; int suggestion_cnt = 0;
+	if ( (suggestion_cnt = mHunspell->suggest(&suggestion_list, word.c_str())) != 0 )
+	{
+		for (int suggestion_index = 0; suggestion_index < suggestion_cnt; suggestion_index++)
+		{
+			suggestions.push_back(suggestion_list[suggestion_index]);
+		}
+		mHunspell->free_list(&suggestion_list, suggestion_cnt);	
+	}
+	return suggestions.size();
+}
+
+// static
+const LLSD LLSpellChecker::getDictionaryData(const std::string& dict_language)
+{
+	for (LLSD::array_const_iterator it = sDictMap.beginArray(); it != sDictMap.endArray(); ++it)
+	{
+		const LLSD& dict_entry = *it;
+		if (dict_language == dict_entry["language"].asString())
+		{
+			return dict_entry;
+		}
+	}
+	return LLSD();
+}
+
+// static
+bool LLSpellChecker::hasDictionary(const std::string& dict_language, bool check_installed)
+{
+	const LLSD dict_info = getDictionaryData(dict_language);
+	return dict_info.has("language") && ( (!check_installed) || (dict_info["installed"].asBoolean()) );
+}
+
+// static
+void LLSpellChecker::setDictionaryData(const LLSD& dict_info)
+{
+	const std::string dict_language = dict_info["language"].asString();
+	if (dict_language.empty())
+	{
+		return;
+	}
+
+	for (LLSD::array_iterator it = sDictMap.beginArray(); it != sDictMap.endArray(); ++it)
+	{
+		LLSD& dict_entry = *it;
+		if (dict_language == dict_entry["language"].asString())
+		{
+			dict_entry = dict_info;
+			return;
+		}
+	}
+	sDictMap.append(dict_info);
+	return;
+}
+
+// static
+void LLSpellChecker::refreshDictionaryMap()
+{
+	const std::string app_path = getDictionaryAppPath();
+	const std::string user_path = getDictionaryUserPath();
+
+	// Load dictionary information (file name, friendly name, ...)
+	llifstream user_file(user_path + DICT_FILE_MAIN, std::ios::binary);
+	if ( (!user_file.is_open()) || (0 == LLSDSerialize::fromXMLDocument(sDictMap, user_file)) || (0 == sDictMap.size()) )
+	{
+		llifstream app_file(app_path + DICT_FILE_MAIN, std::ios::binary);
+		if ( (!app_file.is_open()) || (0 == LLSDSerialize::fromXMLDocument(sDictMap, app_file)) || (0 == sDictMap.size()) )
+		{
+			return;
+		}
+	}
+
+	// Load user installed dictionary information
+	llifstream custom_file(user_path + DICT_FILE_USER, std::ios::binary);
+	if (custom_file.is_open())
+	{
+		LLSD custom_dict_map;
+		LLSDSerialize::fromXMLDocument(custom_dict_map, custom_file);
+		for (LLSD::array_iterator it = custom_dict_map.beginArray(); it != custom_dict_map.endArray(); ++it)
+		{
+			LLSD& dict_info = *it;
+			dict_info["user_installed"] = true;
+			setDictionaryData(dict_info);
+		}
+		custom_file.close();
+	}
+
+	// Look for installed dictionaries
+	std::string tmp_app_path, tmp_user_path;
+	for (LLSD::array_iterator it = sDictMap.beginArray(); it != sDictMap.endArray(); ++it)
+	{
+		LLSD& sdDict = *it;
+		tmp_app_path = (sdDict.has("name")) ? app_path + sdDict["name"].asString() : LLStringUtil::null;
+		tmp_user_path = (sdDict.has("name")) ? user_path + sdDict["name"].asString() : LLStringUtil::null;
+		sdDict["installed"] = 
+			(!tmp_app_path.empty()) && ((gDirUtilp->fileExists(tmp_user_path + ".dic")) || (gDirUtilp->fileExists(tmp_app_path + ".dic")));
+	}
+
+	sSettingsChangeSignal();
+}
+
+void LLSpellChecker::addToCustomDictionary(const std::string& word)
+{
+	if (mHunspell)
+	{
+		mHunspell->add(word.c_str());
+	}
+	addToDictFile(getDictionaryUserPath() + DICT_FILE_CUSTOM, word);
+	sSettingsChangeSignal();
+}
+
+void LLSpellChecker::addToIgnoreList(const std::string& word)
+{
+	std::string word_lower(word);
+	LLStringUtil::toLower(word_lower);
+	if (mIgnoreList.end() == std::find(mIgnoreList.begin(), mIgnoreList.end(), word_lower))
+	{
+		mIgnoreList.push_back(word_lower);
+		addToDictFile(getDictionaryUserPath() + DICT_FILE_IGNORE, word_lower);
+		sSettingsChangeSignal();
+	}
+}
+
+void LLSpellChecker::addToDictFile(const std::string& dict_path, const std::string& word)
+{
+	std::vector<std::string> word_list;
+
+	if (gDirUtilp->fileExists(dict_path))
+	{
+		llifstream file_in(dict_path, std::ios::in);
+		if (file_in.is_open())
+		{
+			std::string word; int line_num = 0;
+			while (getline(file_in, word))
+			{
+				// Skip over the first line since that's just a line count
+				if (0 != line_num)
+				{
+					word_list.push_back(word);
+				}
+				line_num++;
+			}
+		}
+		else
+		{
+			// TODO: show error message?
+			return;
+		}
+	}
+
+	word_list.push_back(word);
+
+	llofstream file_out(dict_path, std::ios::out | std::ios::trunc);	
+	if (file_out.is_open())
+	{
+		file_out << word_list.size() << std::endl;
+		for (std::vector<std::string>::const_iterator itWord = word_list.begin(); itWord != word_list.end(); ++itWord)
+		{
+			file_out << *itWord << std::endl;
+		}
+		file_out.close();
+	}
+}
+
+bool LLSpellChecker::isActiveDictionary(const std::string& dict_language) const
+{
+	return
+		(mDictLanguage == dict_language) || 
+		(mDictSecondary.end() != std::find(mDictSecondary.begin(), mDictSecondary.end(), dict_language));
+}
+
+void LLSpellChecker::setSecondaryDictionaries(dict_list_t dict_list)
+{
+	if (!getUseSpellCheck())
+	{
+		return;
+	}
+
+	// Check if we're only adding secondary dictionaries, or removing them
+	dict_list_t dict_add(llmax(dict_list.size(), mDictSecondary.size())), dict_rem(llmax(dict_list.size(), mDictSecondary.size()));
+	dict_list.sort();
+	mDictSecondary.sort();
+	dict_list_t::iterator end_added = std::set_difference(dict_list.begin(), dict_list.end(), mDictSecondary.begin(), mDictSecondary.end(), dict_add.begin());
+	dict_list_t::iterator end_removed = std::set_difference(mDictSecondary.begin(), mDictSecondary.end(), dict_list.begin(), dict_list.end(), dict_rem.begin());
+
+	if (end_removed != dict_rem.begin())		// We can't remove secondary dictionaries so we need to recreate the Hunspell instance
+	{
+		mDictSecondary = dict_list;
+
+		std::string dict_language = mDictLanguage;
+		initHunspell(dict_language);
+	}
+	else if (end_added != dict_add.begin())		// Add the new secondary dictionaries one by one
+	{
+		const std::string app_path = getDictionaryAppPath();
+		const std::string user_path = getDictionaryUserPath();
+		for (dict_list_t::const_iterator it_added = dict_add.begin(); it_added != end_added; ++it_added)
+		{
+			const LLSD dict_entry = getDictionaryData(*it_added);
+			if ( (!dict_entry.isDefined()) || (!dict_entry["installed"].asBoolean()) )
+			{
+				continue;
+			}
+
+			const std::string strFileDic = dict_entry["name"].asString() + ".dic";
+			if (gDirUtilp->fileExists(user_path + strFileDic))
+			{
+				mHunspell->add_dic((user_path + strFileDic).c_str());
+			}
+			else if (gDirUtilp->fileExists(app_path + strFileDic))
+			{
+				mHunspell->add_dic((app_path + strFileDic).c_str());
+			}
+		}
+		mDictSecondary = dict_list;
+		sSettingsChangeSignal();
+	}
+}
+
+void LLSpellChecker::initHunspell(const std::string& dict_language)
+{
+	if (mHunspell)
+	{
+		delete mHunspell;
+		mHunspell = NULL;
+		mDictLanguage.clear();
+		mDictFile.clear();
+		mIgnoreList.clear();
+	}
+
+	const LLSD dict_entry = (!dict_language.empty()) ? getDictionaryData(dict_language) : LLSD();
+	if ( (!dict_entry.isDefined()) || (!dict_entry["installed"].asBoolean()) || (!dict_entry["is_primary"].asBoolean()))
+	{
+		sSettingsChangeSignal();
+		return;
+	}
+
+	const std::string app_path = getDictionaryAppPath();
+	const std::string user_path = getDictionaryUserPath();
+	if (dict_entry.has("name"))
+	{
+		const std::string filename_aff = dict_entry["name"].asString() + ".aff";
+		const std::string filename_dic = dict_entry["name"].asString() + ".dic";
+		if ( (gDirUtilp->fileExists(user_path + filename_aff)) && (gDirUtilp->fileExists(user_path + filename_dic)) )
+		{
+			mHunspell = new Hunspell((user_path + filename_aff).c_str(), (user_path + filename_dic).c_str());
+		}
+		else if ( (gDirUtilp->fileExists(app_path + filename_aff)) && (gDirUtilp->fileExists(app_path + filename_dic)) )
+		{
+			mHunspell = new Hunspell((app_path + filename_aff).c_str(), (app_path + filename_dic).c_str());
+		}
+		if (!mHunspell)
+		{
+			return;
+		}
+
+		mDictLanguage = dict_language;
+		mDictFile = dict_entry["name"].asString();
+
+		if (gDirUtilp->fileExists(user_path + DICT_FILE_CUSTOM))
+		{
+			mHunspell->add_dic((user_path + DICT_FILE_CUSTOM).c_str());
+		}
+
+		if (gDirUtilp->fileExists(user_path + DICT_FILE_IGNORE))
+		{
+			llifstream file_in(user_path + DICT_FILE_IGNORE, std::ios::in);
+			if (file_in.is_open())
+			{
+				std::string word; int idxLine = 0;
+				while (getline(file_in, word))
+				{
+					// Skip over the first line since that's just a line count
+					if (0 != idxLine)
+					{
+						LLStringUtil::toLower(word);
+						mIgnoreList.push_back(word);
+					}
+					idxLine++;
+				}
+			}
+		}
+
+		for (dict_list_t::const_iterator it = mDictSecondary.begin(); it != mDictSecondary.end(); ++it)
+		{
+			const LLSD dict_entry = getDictionaryData(*it);
+			if ( (!dict_entry.isDefined()) || (!dict_entry["installed"].asBoolean()) )
+			{
+				continue;
+			}
+
+			const std::string filename_dic = dict_entry["name"].asString() + ".dic";
+			if (gDirUtilp->fileExists(user_path + filename_dic))
+			{
+				mHunspell->add_dic((user_path + filename_dic).c_str());
+			}
+			else if (gDirUtilp->fileExists(app_path + filename_dic))
+			{
+				mHunspell->add_dic((app_path + filename_dic).c_str());
+			}
+		}
+	}
+
+	sSettingsChangeSignal();
+}
+
+// static
+const std::string LLSpellChecker::getDictionaryAppPath()
+{
+	std::string dict_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, DICT_DIR, "");
+	return dict_path;
+}
+
+// static
+const std::string LLSpellChecker::getDictionaryUserPath()
+{
+	std::string dict_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, DICT_DIR, "");
+	if (!gDirUtilp->fileExists(dict_path))
+	{
+		LLFile::mkdir(dict_path);
+	}
+	return dict_path;
+}
+
+// static
+bool LLSpellChecker::getUseSpellCheck()
+{
+	return (LLSpellChecker::instanceExists()) && (LLSpellChecker::instance().mHunspell);
+}
+
+// static
+bool LLSpellChecker::canRemoveDictionary(const std::string& dict_language)
+{
+	// Only user-installed inactive dictionaries can be removed
+	const LLSD dict_info = getDictionaryData(dict_language);
+	return 
+		(dict_info["user_installed"].asBoolean()) && 
+		( (!getUseSpellCheck()) || (!LLSpellChecker::instance().isActiveDictionary(dict_language)) );
+}
+
+// static
+void LLSpellChecker::removeDictionary(const std::string& dict_language)
+{
+	if (!canRemoveDictionary(dict_language))
+	{
+		return;
+	}
+
+	LLSD dict_map = loadUserDictionaryMap();
+	for (LLSD::array_const_iterator it = dict_map.beginArray(); it != dict_map.endArray(); ++it)
+	{
+		const LLSD& dict_info = *it;
+		if (dict_info["language"].asString() == dict_language)
+		{
+			const std::string dict_dic = getDictionaryUserPath() + dict_info["name"].asString() + ".dic";
+			if (gDirUtilp->fileExists(dict_dic))
+			{
+				LLFile::remove(dict_dic);
+			}
+			const std::string dict_aff = getDictionaryUserPath() + dict_info["name"].asString() + ".aff";
+			if (gDirUtilp->fileExists(dict_aff))
+			{
+				LLFile::remove(dict_aff);
+			}
+			dict_map.erase(it - dict_map.beginArray());
+			break;
+		}
+	}
+	saveUserDictionaryMap(dict_map);
+
+	refreshDictionaryMap();
+}
+
+// static
+LLSD LLSpellChecker::loadUserDictionaryMap()
+{
+	LLSD dict_map;
+	llifstream dict_file(getDictionaryUserPath() + DICT_FILE_USER, std::ios::binary);
+	if (dict_file.is_open())
+	{
+		LLSDSerialize::fromXMLDocument(dict_map, dict_file);
+		dict_file.close();
+	}
+	return dict_map;
+}
+
+// static
+void LLSpellChecker::saveUserDictionaryMap(const LLSD& dict_map)
+{
+	llofstream dict_file(getDictionaryUserPath() + DICT_FILE_USER, std::ios::trunc);
+	if (dict_file.is_open())
+	{
+		LLSDSerialize::toPrettyXML(dict_map, dict_file);
+		dict_file.close();
+	}
+}
+
+// static
+boost::signals2::connection LLSpellChecker::setSettingsChangeCallback(const settings_change_signal_t::slot_type& cb)
+{
+	return sSettingsChangeSignal.connect(cb);
+}
+
+// static
+void LLSpellChecker::setUseSpellCheck(const std::string& dict_language)
+{
+	if ( (((dict_language.empty()) && (getUseSpellCheck())) || (!dict_language.empty())) && 
+		 (LLSpellChecker::instance().mDictLanguage != dict_language) )
+	{
+		LLSpellChecker::instance().initHunspell(dict_language);
+	}
+}
+
+// static
+void LLSpellChecker::initClass()
+{
+	if (sDictMap.isUndefined())
+	{
+		refreshDictionaryMap();
+	}
+}
diff --git a/indra/llui/llspellcheck.h b/indra/llui/llspellcheck.h
new file mode 100644
index 0000000000000000000000000000000000000000..4ab80195ead318f7f586563474d0f9fb5706d10d
--- /dev/null
+++ b/indra/llui/llspellcheck.h
@@ -0,0 +1,93 @@
+/** 
+ * @file llspellcheck.h
+ * @brief Spell checking functionality
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLSPELLCHECK_H
+#define LLSPELLCHECK_H
+
+#include "llsingleton.h"
+#include "llui.h"
+#include <boost/signals2.hpp>
+
+class Hunspell;
+
+class LLSpellChecker : public LLSingleton<LLSpellChecker>, public LLInitClass<LLSpellChecker>
+{
+	friend class LLSingleton<LLSpellChecker>;
+	friend class LLInitClass<LLSpellChecker>;
+protected:
+	LLSpellChecker();
+	~LLSpellChecker();
+
+public:
+	void addToCustomDictionary(const std::string& word);
+	void addToIgnoreList(const std::string& word);
+	bool checkSpelling(const std::string& word) const;
+	S32  getSuggestions(const std::string& word, std::vector<std::string>& suggestions) const;
+protected:
+	void addToDictFile(const std::string& dict_path, const std::string& word);
+	void initHunspell(const std::string& dict_language);
+
+public:
+	typedef std::list<std::string> dict_list_t;
+
+	const std::string&	getPrimaryDictionary() const { return mDictLanguage; }
+	const dict_list_t&	getSecondaryDictionaries() const { return mDictSecondary; }
+	bool				isActiveDictionary(const std::string& dict_language) const;
+	void				setSecondaryDictionaries(dict_list_t dict_list);
+
+	static bool				 canRemoveDictionary(const std::string& dict_language);
+	static const std::string getDictionaryAppPath();
+	static const std::string getDictionaryUserPath();
+	static const LLSD		 getDictionaryData(const std::string& dict_language);
+	static const LLSD&		 getDictionaryMap() { return sDictMap; }
+	static bool				 getUseSpellCheck();
+	static bool				 hasDictionary(const std::string& dict_language, bool check_installed = false);
+	static void				 refreshDictionaryMap();
+	static void				 removeDictionary(const std::string& dict_language);
+	static void				 setUseSpellCheck(const std::string& dict_language);
+protected:
+	static LLSD				 loadUserDictionaryMap();
+	static void				 setDictionaryData(const LLSD& dict_info);
+	static void				 saveUserDictionaryMap(const LLSD& dict_map);
+
+public:
+	typedef boost::signals2::signal<void()> settings_change_signal_t;
+	static boost::signals2::connection setSettingsChangeCallback(const settings_change_signal_t::slot_type& cb);
+protected:
+	static void initClass();
+
+protected:
+	Hunspell*	mHunspell;
+	std::string	mDictLanguage;
+	std::string	mDictFile;
+	dict_list_t	mDictSecondary;
+	std::vector<std::string> mIgnoreList;
+
+	static LLSD						sDictMap;
+	static settings_change_signal_t	sSettingsChangeSignal;
+};
+
+#endif // LLSPELLCHECK_H
diff --git a/indra/llui/llspellcheckmenuhandler.h b/indra/llui/llspellcheckmenuhandler.h
new file mode 100644
index 0000000000000000000000000000000000000000..d5c95bad39a7586dddd1e81155ba223b7bac78c3
--- /dev/null
+++ b/indra/llui/llspellcheckmenuhandler.h
@@ -0,0 +1,46 @@
+/** 
+ * @file llspellcheckmenuhandler.h
+ * @brief Interface used by spell check menu handling
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLSPELLCHECKMENUHANDLER_H
+#define LLSPELLCHECKMENUHANDLER_H
+
+class LLSpellCheckMenuHandler
+{
+public:
+	virtual bool	getSpellCheck() const			{ return false; }
+
+	virtual const std::string& getSuggestion(U32 index) const	{ return LLStringUtil::null; }
+	virtual U32		getSuggestionCount() const		{ return 0; }
+	virtual void	replaceWithSuggestion(U32 index){}
+
+	virtual void	addToDictionary()				{}
+	virtual bool	canAddToDictionary() const		{ return false; }
+
+	virtual void	addToIgnore()					{}
+	virtual bool	canAddToIgnore() const			{ return false; }
+};
+
+#endif // LLSPELLCHECKMENUHANDLER_H
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index ef17fa4887f29d784984b2506134073f74fc6aeb..661ec589d71d2d6f1d9c1d2be41563dfa76258f9 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -32,6 +32,7 @@
 #include "lllocalcliprect.h"
 #include "llmenugl.h"
 #include "llscrollcontainer.h"
+#include "llspellcheck.h"
 #include "llstl.h"
 #include "lltextparser.h"
 #include "lltextutil.h"
@@ -155,6 +156,7 @@ LLTextBase::Params::Params()
 	plain_text("plain_text",false),
 	track_end("track_end", false),
 	read_only("read_only", false),
+	spellcheck("spellcheck", false),
 	v_pad("v_pad", 0),
 	h_pad("h_pad", 0),
 	clip("clip", true),
@@ -181,6 +183,9 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
 	mFontShadow(p.font_shadow),
 	mPopupMenu(NULL),
 	mReadOnly(p.read_only),
+	mSpellCheck(p.spellcheck),
+	mSpellCheckStart(-1),
+	mSpellCheckEnd(-1),
 	mCursorColor(p.cursor_color),
 	mFgColor(p.text_color),
 	mBorderVisible( p.border_visible ),
@@ -246,6 +251,12 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
 		addChild(mDocumentView);
 	}
 
+	if (mSpellCheck)
+	{
+		LLSpellChecker::setSettingsChangeCallback(boost::bind(&LLTextBase::onSpellCheckSettingsChange, this));
+	}
+	mSpellCheckTimer.reset();
+
 	createDefaultSegment();
 
 	updateRects();
@@ -530,8 +541,92 @@ void LLTextBase::drawText()
 		return;
 	}
 
+	// Perform spell check if needed
+	if ( (getSpellCheck()) && (getWText().length() > 2) )
+	{
+		// Calculate start and end indices for the spell checking range
+		S32 start = line_start, end = getLineEnd(last_line);
+
+		if ( (mSpellCheckStart != start) || (mSpellCheckEnd != end) )
+		{
+			const LLWString& wstrText = getWText(); 
+			mMisspellRanges.clear();
+
+			segment_set_t::const_iterator seg_it = getSegIterContaining(start);
+			while (mSegments.end() != seg_it)
+			{
+				LLTextSegmentPtr text_segment = *seg_it;
+				if ( (text_segment.isNull()) || (text_segment->getStart() >= end) )
+				{
+					break;
+				}
+
+				if (!text_segment->canEdit())
+				{
+					++seg_it;
+					continue;
+				}
+
+				// Combine adjoining text segments into one
+				U32 seg_start = text_segment->getStart(), seg_end = llmin(text_segment->getEnd(), end);
+				while (mSegments.end() != ++seg_it)
+				{
+					text_segment = *seg_it;
+					if ( (text_segment.isNull()) || (!text_segment->canEdit()) || (text_segment->getStart() >= end) )
+					{
+						break;
+					}
+					seg_end = llmin(text_segment->getEnd(), end);
+				}
+
+				// Find the start of the first word
+				U32 word_start = seg_start, word_end = -1;
+				while ( (word_start < wstrText.length()) && (!LLStringOps::isAlpha(wstrText[word_start])) )
+				{
+					word_start++;
+				}
+
+				// Iterate over all words in the text block and check them one by one
+				while (word_start < seg_end)
+				{
+					// Find the end of the current word (special case handling for "'" when it's used as a contraction)
+					word_end = word_start + 1;
+					while ( (word_end < seg_end) && 
+							((LLWStringUtil::isPartOfWord(wstrText[word_end])) ||
+								((L'\'' == wstrText[word_end]) && 
+								(LLStringOps::isAlnum(wstrText[word_end - 1])) && (LLStringOps::isAlnum(wstrText[word_end + 1])))) )
+					{
+						word_end++;
+					}
+					if (word_end > seg_end)
+					{
+						break;
+					}
+
+					// Don't process words shorter than 3 characters
+					std::string word = wstring_to_utf8str(wstrText.substr(word_start, word_end - word_start));
+					if ( (word.length() >= 3) && (!LLSpellChecker::instance().checkSpelling(word)) )
+					{
+						mMisspellRanges.push_back(std::pair<U32, U32>(word_start, word_end));
+					}
+
+					// Find the start of the next word
+					word_start = word_end + 1;
+					while ( (word_start < seg_end) && (!LLWStringUtil::isPartOfWord(wstrText[word_start])) )
+					{
+						word_start++;
+					}
+				}
+			}
+
+			mSpellCheckStart = start;
+			mSpellCheckEnd = end;
+		}
+	}
+
 	LLTextSegmentPtr cur_segment = *seg_iter;
 
+	std::list<std::pair<U32, U32> >::const_iterator misspell_it = std::lower_bound(mMisspellRanges.begin(), mMisspellRanges.end(), std::pair<U32, U32>(line_start, 0));
 	for (S32 cur_line = first_line; cur_line < last_line; cur_line++)
 	{
 		S32 next_line = cur_line + 1;
@@ -566,7 +661,8 @@ void LLTextBase::drawText()
 				cur_segment = *seg_iter;
 			}
 			
-			S32 clipped_end	=	llmin( line_end, cur_segment->getEnd() )  - cur_segment->getStart();
+			S32 seg_end = llmin(line_end, cur_segment->getEnd());
+			S32 clipped_end	= seg_end - cur_segment->getStart();
 
 			if (mUseEllipses								// using ellipses
 				&& clipped_end == line_end					// last segment on line
@@ -578,6 +674,46 @@ void LLTextBase::drawText()
 				text_rect.mRight -= 2;
 			}
 
+			// Draw squiggly lines under any visible misspelled words
+			while ( (mMisspellRanges.end() != misspell_it) && (misspell_it->first < seg_end) && (misspell_it->second > seg_start) )
+			{
+				// Skip the current word if the user is still busy editing it
+				if ( (!mSpellCheckTimer.hasExpired()) && (misspell_it->first <= (U32)mCursorPos) && (misspell_it->second >= (U32)mCursorPos) )
+				{
+					++misspell_it;
+ 					continue;
+				}
+
+				U32 misspell_start = llmax<U32>(misspell_it->first, seg_start), misspell_end = llmin<U32>(misspell_it->second, seg_end);
+				S32 squiggle_start = 0, squiggle_end = 0, pony = 0;
+				cur_segment->getDimensions(seg_start - cur_segment->getStart(), misspell_start - seg_start, squiggle_start, pony);
+				cur_segment->getDimensions(misspell_start - cur_segment->getStart(), misspell_end - misspell_start, squiggle_end, pony);
+				squiggle_start += text_rect.mLeft;
+
+				pony = (squiggle_end + 3) / 6;
+				squiggle_start += squiggle_end / 2 - pony * 3;
+				squiggle_end = squiggle_start + pony * 6;
+
+				S32 squiggle_bottom = text_rect.mBottom + (S32)cur_segment->getStyle()->getFont()->getDescenderHeight();
+
+				gGL.color4ub(255, 0, 0, 200);
+				while (squiggle_start + 1 < squiggle_end)
+				{
+					gl_line_2d(squiggle_start, squiggle_bottom, squiggle_start + 2, squiggle_bottom - 2);
+					if (squiggle_start + 3 < squiggle_end)
+					{
+						gl_line_2d(squiggle_start + 2, squiggle_bottom - 3, squiggle_start + 4, squiggle_bottom - 1);
+					}
+					squiggle_start += 4;
+				}
+
+				if (misspell_it->second > seg_end)
+				{
+					break;
+				}
+				++misspell_it;
+			}
+
 			text_rect.mLeft = (S32)(cur_segment->draw(seg_start - cur_segment->getStart(), clipped_end, selection_left, selection_right, text_rect));
 
 			seg_start = clipped_end + cur_segment->getStart();
@@ -1103,6 +1239,99 @@ void LLTextBase::deselect()
 	mIsSelecting = FALSE;
 }
 
+bool LLTextBase::getSpellCheck() const
+{
+	return (LLSpellChecker::getUseSpellCheck()) && (!mReadOnly) && (mSpellCheck);
+}
+
+const std::string& LLTextBase::getSuggestion(U32 index) const
+{
+	return (index < mSuggestionList.size()) ? mSuggestionList[index] : LLStringUtil::null;
+}
+
+U32 LLTextBase::getSuggestionCount() const
+{
+	return mSuggestionList.size();
+}
+
+void LLTextBase::replaceWithSuggestion(U32 index)
+{
+	for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+	{
+		if ( (it->first <= (U32)mCursorPos) && (it->second >= (U32)mCursorPos) )
+		{
+			deselect();
+
+			// Delete the misspelled word
+			removeStringNoUndo(it->first, it->second - it->first);
+
+			// Insert the suggestion in its place
+			LLWString suggestion = utf8str_to_wstring(mSuggestionList[index]);
+			insertStringNoUndo(it->first, utf8str_to_wstring(mSuggestionList[index]));
+			setCursorPos(it->first + (S32)suggestion.length());
+
+			break;
+		}
+	}
+	mSpellCheckStart = mSpellCheckEnd = -1;
+}
+
+void LLTextBase::addToDictionary()
+{
+	if (canAddToDictionary())
+	{
+		LLSpellChecker::instance().addToCustomDictionary(getMisspelledWord(mCursorPos));
+	}
+}
+
+bool LLTextBase::canAddToDictionary() const
+{
+	return (getSpellCheck()) && (isMisspelledWord(mCursorPos));
+}
+
+void LLTextBase::addToIgnore()
+{
+	if (canAddToIgnore())
+	{
+		LLSpellChecker::instance().addToIgnoreList(getMisspelledWord(mCursorPos));
+	}
+}
+
+bool LLTextBase::canAddToIgnore() const
+{
+	return (getSpellCheck()) && (isMisspelledWord(mCursorPos));
+}
+
+std::string LLTextBase::getMisspelledWord(U32 pos) const
+{
+	for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+	{
+		if ( (it->first <= pos) && (it->second >= pos) )
+		{
+			return wstring_to_utf8str(getWText().substr(it->first, it->second - it->first));
+		}
+	}
+	return LLStringUtil::null;
+}
+
+bool LLTextBase::isMisspelledWord(U32 pos) const
+{
+	for (std::list<std::pair<U32, U32> >::const_iterator it = mMisspellRanges.begin(); it != mMisspellRanges.end(); ++it)
+	{
+		if ( (it->first <= pos) && (it->second >= pos) )
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+void LLTextBase::onSpellCheckSettingsChange()
+{
+	// Recheck the spelling on every change
+	mMisspellRanges.clear();
+	mSpellCheckStart = mSpellCheckEnd = -1;
+}
 
 // Sets the scrollbar from the cursor position
 void LLTextBase::updateScrollFromCursor()
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 0549141b72a20531d5b10af3601bbf36eeb52bf9..90b147cee1dfc35d853a3e221dca9a46ea6d22c8 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -30,6 +30,7 @@
 
 #include "v4color.h"
 #include "lleditmenuhandler.h"
+#include "llspellcheckmenuhandler.h"
 #include "llstyle.h"
 #include "llkeywords.h"
 #include "llpanel.h"
@@ -230,7 +231,8 @@ typedef LLPointer<LLTextSegment> LLTextSegmentPtr;
 ///
 class LLTextBase 
 :	public LLUICtrl,
-	protected LLEditMenuHandler
+	protected LLEditMenuHandler,
+	public LLSpellCheckMenuHandler
 {
 public:
 	friend class LLTextSegment;
@@ -259,6 +261,7 @@ public:
 								border_visible,
 								track_end,
 								read_only,
+								spellcheck,
 								allow_scroll,
 								plain_text,
 								wrap,
@@ -311,6 +314,24 @@ public:
 	/*virtual*/ BOOL		canDeselect() const;
 	/*virtual*/ void		deselect();
 
+	// LLSpellCheckMenuHandler overrides
+	/*virtual*/ bool		getSpellCheck() const;
+
+	/*virtual*/ const std::string& getSuggestion(U32 index) const;
+	/*virtual*/ U32			getSuggestionCount() const;
+	/*virtual*/ void		replaceWithSuggestion(U32 index);
+
+	/*virtual*/ void		addToDictionary();
+	/*virtual*/ bool		canAddToDictionary() const;
+
+	/*virtual*/ void		addToIgnore();
+	/*virtual*/ bool		canAddToIgnore() const;
+
+	// Spell checking helper functions
+	std::string				getMisspelledWord(U32 pos) const;
+	bool					isMisspelledWord(U32 pos) const;
+	void					onSpellCheckSettingsChange();
+
 	// used by LLTextSegment layout code
 	bool					getWordWrap() { return mWordWrap; }
 	bool					getUseEllipses() { return mUseEllipses; }
@@ -540,6 +561,14 @@ protected:
 	
 	BOOL						mIsSelecting;		// Are we in the middle of a drag-select? 
 
+	// spell checking
+	bool						mSpellCheck;
+	S32							mSpellCheckStart;
+	S32							mSpellCheckEnd;
+	LLTimer						mSpellCheckTimer;
+	std::list<std::pair<U32, U32> > mMisspellRanges;
+	std::vector<std::string>		mSuggestionList;
+
 	// configuration
 	S32							mHPad;				// padding on left of text
 	S32							mVPad;				// padding above text
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 9720dded6c658e5844fe04a949a5997b4060d742..144b6960a1b03cf090f599207e7c02a5b5410097 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -54,6 +54,7 @@
 #include "llwindow.h"
 #include "lltextparser.h"
 #include "llscrollcontainer.h"
+#include "llspellcheck.h"
 #include "llpanel.h"
 #include "llurlregistry.h"
 #include "lltooltip.h"
@@ -77,6 +78,7 @@ template class LLTextEditor* LLView::getChild<class LLTextEditor>(
 const S32	UI_TEXTEDITOR_LINE_NUMBER_MARGIN = 32;
 const S32	UI_TEXTEDITOR_LINE_NUMBER_DIGITS = 4;
 const S32	SPACES_PER_TAB = 4;
+const F32	SPELLCHECK_DELAY = 0.5f;	// delay between the last keypress and spell checking the word the cursor is on
 
 ///////////////////////////////////////////////////////////////////
 
@@ -1953,7 +1955,38 @@ void LLTextEditor::showContextMenu(S32 x, S32 y)
 
 	S32 screen_x, screen_y;
 	localPointToScreen(x, y, &screen_x, &screen_y);
-	mContextMenu->show(screen_x, screen_y);
+
+	setCursorAtLocalPos(x, y, false);
+	if (hasSelection())
+	{
+		if ( (mCursorPos < llmin(mSelectionStart, mSelectionEnd)) || (mCursorPos > llmax(mSelectionStart, mSelectionEnd)) )
+		{
+			deselect();
+		}
+		else
+		{
+			setCursorPos(llmax(mSelectionStart, mSelectionEnd));
+		}
+	}
+
+	bool use_spellcheck = getSpellCheck(), is_misspelled = false;
+	if (use_spellcheck)
+	{
+		mSuggestionList.clear();
+
+		// If the cursor is on a misspelled word, retrieve suggestions for it
+		std::string misspelled_word = getMisspelledWord(mCursorPos);
+		if ((is_misspelled = !misspelled_word.empty()) == true)
+		{
+			LLSpellChecker::instance().getSuggestions(misspelled_word, mSuggestionList);
+		}
+	}
+
+	mContextMenu->setItemVisible("Suggestion Separator", (use_spellcheck) && (!mSuggestionList.empty()));
+	mContextMenu->setItemVisible("Add to Dictionary", (use_spellcheck) && (is_misspelled));
+	mContextMenu->setItemVisible("Add to Ignore", (use_spellcheck) && (is_misspelled));
+	mContextMenu->setItemVisible("Spellcheck Separator", (use_spellcheck) && (is_misspelled));
+	mContextMenu->show(screen_x, screen_y, this);
 }
 
 
@@ -2838,6 +2871,9 @@ void LLTextEditor::setKeystrokeCallback(const keystroke_signal_t::slot_type& cal
 void LLTextEditor::onKeyStroke()
 {
 	mKeystrokeSignal(this);
+
+	mSpellCheckStart = mSpellCheckEnd = -1;
+	mSpellCheckTimer.setTimerExpirySec(SPELLCHECK_DELAY);
 }
 
 //virtual
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index a925a39246b72c392894705d9e8df9180519fcd2..65170a214099dc8511d1b4e2900649a463e533a0 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -13,6 +13,7 @@ include(EXPAT)
 include(FMOD)
 include(OPENAL)
 include(FindOpenGL)
+include(Hunspell)
 include(JsonCpp)
 include(LLAudio)
 include(LLCharacter)
@@ -70,6 +71,7 @@ include_directories(
     ${LLLOGIN_INCLUDE_DIRS}
     ${UPDATER_INCLUDE_DIRS}
     ${LIBS_PREBUILT_DIR}/include/collada
+    ${LIBS_PREBUILD_DIR}/include/hunspell
     ${OPENAL_LIB_INCLUDE_DIRS}
     ${LIBS_PREBUILT_DIR}/include/collada/1.4
     )
@@ -96,6 +98,7 @@ set(viewer_SOURCE_FILES
     llassetuploadresponders.cpp
     llattachmentsmgr.cpp
     llaudiosourcevo.cpp
+    llautoreplace.cpp
     llavataractions.cpp
     llavatariconctrl.cpp
     llavatarlist.cpp
@@ -167,6 +170,7 @@ set(viewer_SOURCE_FILES
     llfloaterabout.cpp
     llfloaterbvhpreview.cpp
     llfloaterauction.cpp
+    llfloaterautoreplacesettings.cpp
     llfloateravatar.cpp
     llfloateravatarpicker.cpp
     llfloateravatartextures.cpp
@@ -231,6 +235,7 @@ set(viewer_SOURCE_FILES
     llfloatersidepanelcontainer.cpp
     llfloatersnapshot.cpp
     llfloatersounddevices.cpp
+    llfloaterspellchecksettings.cpp
     llfloatertelehub.cpp
     llfloatertestinspectors.cpp
     llfloatertestlistview.cpp
@@ -653,6 +658,7 @@ set(viewer_HEADER_FILES
     llassetuploadresponders.h
     llattachmentsmgr.h
     llaudiosourcevo.h
+    llautoreplace.h
     llavataractions.h
     llavatariconctrl.h
     llavatarlist.h
@@ -724,6 +730,7 @@ set(viewer_HEADER_FILES
     llfloaterabout.h
     llfloaterbvhpreview.h
     llfloaterauction.h
+    llfloaterautoreplacesettings.h
     llfloateravatar.h
     llfloateravatarpicker.h
     llfloateravatartextures.h
@@ -788,6 +795,7 @@ set(viewer_HEADER_FILES
     llfloatersidepanelcontainer.h
     llfloatersnapshot.h
     llfloatersounddevices.h
+    llfloaterspellchecksettings.h
     llfloatertelehub.h
     llfloatertestinspectors.h
     llfloatertestlistview.h
@@ -1572,6 +1580,9 @@ if (WINDOWS)
       ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcp100.dll
       ${SHARED_LIB_STAGING_DIR}/Debug/msvcr100d.dll
       ${SHARED_LIB_STAGING_DIR}/Debug/msvcp100d.dll
+      ${SHARED_LIB_STAGING_DIR}/Release/libhunspell.dll
+      ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libhunspell.dll
+      ${SHARED_LIB_STAGING_DIR}/Debug/libhunspell.dll
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/SLVoice.exe
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll
@@ -1750,6 +1761,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}
     ${LLMATH_LIBRARIES}
     ${LLCOMMON_LIBRARIES}
     ${NDOF_LIBRARY}
+    ${HUNSPELL_LIBRARY}
     ${viewer_LIBRARIES}
     ${BOOST_PROGRAM_OPTIONS_LIBRARY}
     ${BOOST_REGEX_LIBRARY}
diff --git a/indra/newview/app_settings/autoreplace.xml b/indra/newview/app_settings/autoreplace.xml
new file mode 100644
index 0000000000000000000000000000000000000000..09d19f7b04154b72167444d25e8d3207abbf217f
--- /dev/null
+++ b/indra/newview/app_settings/autoreplace.xml
@@ -0,0 +1,8330 @@
+<llsd>
+  <array>
+    <map>
+      <key>name</key>
+      <string>Abbreviations</string>
+      <key>replacements</key>
+      <map>
+        <key>afaic</key>
+        <string>As far as I am concerned</string>
+        <key>afaik</key>
+        <string>As far as I know</string>
+        <key>afk</key>
+        <string>away from keyboard</string>
+        <key>atm</key>
+        <string>at the moment</string>
+        <key>bbiab</key>
+        <string>be back in a bit</string>
+        <key>bbl</key>
+        <string>be back later</string>
+        <key>brb</key>
+        <string>be right back</string>
+        <key>btw</key>
+        <string>by the way</string>
+        <key>fyi</key>
+        <string>For your information</string>
+        <key>fwiw</key>
+        <string>For what its worth</string>
+        <key>gtg</key>
+        <string>got to go</string>
+        <key>idk</key>
+        <string>I don't know</string>
+        <key>iirc</key>
+        <string>if I recall correctly</string>
+        <key>imho</key>
+        <string>in my humble opinion</string>
+        <key>imo</key>
+        <string>in my opinion</string>
+        <key>irl</key>
+        <string>in real life</string>
+        <key>np</key>
+        <string>no problem</string>
+        <key>nsfw</key>
+        <string>not safe for work</string>
+        <key>nvm</key>
+        <string>nevermind</string>
+        <key>tc</key>
+        <string>take care</string>
+        <key>thx</key>
+        <string>thanks</string>
+        <key>ttfn</key>
+        <string>ta-ta for now</string>
+        <key>ttyl</key>
+        <string>talk to you later</string>
+        <key>ty</key>
+        <string>thank you</string>
+        <key>tyvm</key>
+        <string>thank you very much</string>
+        <key>wb</key>
+        <string>welcome back</string>
+        <key>yw</key>
+        <string>you&apos;re welcome</string>
+        <key>yvw</key>
+        <string>you&apos;re very welcome</string>
+      </map>
+    </map>
+    <map>
+      <key>name</key>
+      <string>Spelling Corrections</string>
+      <key>replacements</key>
+      <map>
+        <key>Amercia</key>
+        <string>America</string>
+        <key>Bernouilli</key>
+        <string>Bernoulli</string>
+        <key>Blitzkreig</key>
+        <string>Blitzkrieg</string>
+        <key>Bonnano</key>
+        <string>Bonanno</string>
+        <key>Brasillian</key>
+        <string>Brazilian</string>
+        <key>Britian</key>
+        <string>Britain</string>
+        <key>Brittish</key>
+        <string>British</string>
+        <key>Buddah</key>
+        <string>Buddha</string>
+        <key>Buddist</key>
+        <string>Buddhist</string>
+        <key>Cambrige</key>
+        <string>Cambridge</string>
+        <key>Capetown</key>
+        <string>Cape Town</string>
+        <key>Carmalite</key>
+        <string>Carmelite</string>
+        <key>Carnagie</key>
+        <string>Carnegie</string>
+        <key>Carnagie-Mellon</key>
+        <string>Carnegie-Mellon</string>
+        <key>Carnigie</key>
+        <string>Carnegie</string>
+        <key>Carnigie-Mellon</key>
+        <string>Carnegie-Mellon</string>
+        <key>Carribbean</key>
+        <string>Caribbean</string>
+        <key>Carribean</key>
+        <string>Caribbean</string>
+        <key>Carthagian</key>
+        <string>Carthaginian</string>
+        <key>Cataline</key>
+        <string>Catiline</string>
+        <key>Ceasar</key>
+        <string>Caesar</string>
+        <key>Celcius</key>
+        <string>Celsius</string>
+        <key>Champange</key>
+        <string>Champagne</string>
+        <key>Cincinatti</key>
+        <string>Cincinnati</string>
+        <key>Cincinnatti</key>
+        <string>Cincinnati</string>
+        <key>Conneticut</key>
+        <string>Connecticut</string>
+        <key>Dardenelles</key>
+        <string>Dardanelles</string>
+        <key>Dravadian</key>
+        <string>Dravidian</string>
+        <key>Enlish</key>
+        <string>English</string>
+        <key>Europian</key>
+        <string>European</string>
+        <key>Europians</key>
+        <string>Europeans</string>
+        <key>Eurpean</key>
+        <string>European</string>
+        <key>Eurpoean</key>
+        <string>European</string>
+        <key>Farenheit</key>
+        <string>Fahrenheit</string>
+        <key>Febuary</key>
+        <string>February</string>
+        <key>Feburary</key>
+        <string>February</string>
+        <key>Flemmish</key>
+        <string>Flemish</string>
+        <key>Formalhaut</key>
+        <string>Fomalhaut</string>
+        <key>Foundland</key>
+        <string>Newfoundland</string>
+        <key>Fransiscan</key>
+        <string>Franciscan</string>
+        <key>Fransiscans</key>
+        <string>Franciscans</string>
+        <key>Galations</key>
+        <string>Galatians</string>
+        <key>Gameboy</key>
+        <string>Game Boy</string>
+        <key>Ghandi</key>
+        <string>Gandhi</string>
+        <key>Godounov</key>
+        <string>Godunov</string>
+        <key>Gothenberg</key>
+        <string>Gothenburg</string>
+        <key>Gottleib</key>
+        <string>Gottlieb</string>
+        <key>Guaduloupe</key>
+        <string>Guadalupe</string>
+        <key>Guadulupe</key>
+        <string>Guadalupe</string>
+        <key>Guatamala</key>
+        <string>Guatemala</string>
+        <key>Guatamalan</key>
+        <string>Guatemalan</string>
+        <key>Guilia</key>
+        <string>Giulia</string>
+        <key>Guilio</key>
+        <string>Giulio</string>
+        <key>Guiness</key>
+        <string>Guinness</string>
+        <key>Guiseppe</key>
+        <string>Giuseppe</string>
+        <key>Habsbourg</key>
+        <string>Habsburg</string>
+        <key>Hallowean</key>
+        <string>Halloween</string>
+        <key>Heidelburg</key>
+        <string>Heidelberg</string>
+        <key>Ihaca</key>
+        <string>Ithaca</string>
+        <key>Israelies</key>
+        <string>Israelis</string>
+        <key>Janurary</key>
+        <string>January</string>
+        <key>Januray</key>
+        <string>January</string>
+        <key>Japanes</key>
+        <string>Japanese</string>
+        <key>Johanine</key>
+        <string>Johannine</string>
+        <key>Jospeh</key>
+        <string>Joseph</string>
+        <key>Juadaism</key>
+        <string>Judaism</string>
+        <key>Juadism</key>
+        <string>Judaism</string>
+        <key>Lybia</key>
+        <string>Libya</string>
+        <key>Malcom</key>
+        <string>Malcolm</string>
+        <key>Massachussets</key>
+        <string>Massachusetts</string>
+        <key>Massachussetts</key>
+        <string>Massachusetts</string>
+        <key>Mediteranean</key>
+        <string>Mediterranean</string>
+        <key>Michagan</key>
+        <string>Michigan</string>
+        <key>Misouri</key>
+        <string>Missouri</string>
+        <key>Missisipi</key>
+        <string>Mississippi</string>
+        <key>Missisippi</key>
+        <string>Mississippi</string>
+        <key>Monserrat</key>
+        <string>Montserrat</string>
+        <key>Montnana</key>
+        <string>Montana</string>
+        <key>Morisette</key>
+        <string>Morissette</string>
+        <key>Morrisette</key>
+        <string>Morissette</string>
+        <key>Mythraic</key>
+        <string>Mithraic</string>
+        <key>Naploeon</key>
+        <string>Napoleon</string>
+        <key>Napolean</key>
+        <string>Napoleon</string>
+        <key>Napoleonian</key>
+        <string>Napoleonic</string>
+        <key>Nazereth</key>
+        <string>Nazareth</string>
+        <key>Newyorker</key>
+        <string>New Yorker</string>
+        <key>Novermber</key>
+        <string>November</string>
+        <key>Nullabour</key>
+        <string>Nullarbor</string>
+        <key>Nuremburg</key>
+        <string>Nuremberg</string>
+        <key>Palistian</key>
+        <string>Palestinian</string>
+        <key>Palistinian</key>
+        <string>Palestinian</string>
+        <key>Palistinians</key>
+        <string>Palestinians</string>
+        <key>Papanicalou</key>
+        <string>Papanicolaou</string>
+        <key>Peloponnes</key>
+        <string>Peloponnesus</string>
+        <key>Pennyslvania</key>
+        <string>Pennsylvania</string>
+        <key>Pharoah</key>
+        <string>Pharaoh</string>
+        <key>Philipines</key>
+        <string>Philippines</string>
+        <key>Phillipine</key>
+        <string>Philippine</string>
+        <key>Phillipines</key>
+        <string>Philippines</string>
+        <key>Phillippines</key>
+        <string>Philippines</string>
+        <key>Phonecian</key>
+        <string>Phoenecian</string>
+        <key>Portugese</key>
+        <string>Portuguese</string>
+        <key>Postdam</key>
+        <string>Potsdam</string>
+        <key>Premonasterians</key>
+        <string>Premonstratensians</string>
+        <key>Pucini</key>
+        <string>Puccini</string>
+        <key>Puertorrican</key>
+        <string>Puerto Rican</string>
+        <key>Puertorricans</key>
+        <string>Puerto Ricans</string>
+        <key>Queenland</key>
+        <string>Queensland</string>
+        <key>Rockerfeller</key>
+        <string>Rockefeller</string>
+        <key>Russion</key>
+        <string>Russian</string>
+        <key>Sanhedrim</key>
+        <string>Sanhedrin</string>
+        <key>Saterday</key>
+        <string>Saturday</string>
+        <key>Saterdays</key>
+        <string>Saturdays</string>
+        <key>Sionist</key>
+        <string>Zionist</string>
+        <key>Sionists</key>
+        <string>Zionists</string>
+        <key>Sixtin</key>
+        <string>Sistine</string>
+        <key>Skagerak</key>
+        <string>Skagerrak</string>
+        <key>Tolkein</key>
+        <string>Tolkien</string>
+        <key>Tuscon</key>
+        <string>Tucson</string>
+        <key>Ukranian</key>
+        <string>Ukrainian</string>
+        <key>UnitesStates</key>
+        <string>UnitedStates</string>
+        <key>Yementite</key>
+        <string>Yemenite</string>
+        <key>abandonned</key>
+        <string>abandoned</string>
+        <key>aberation</key>
+        <string>aberration</string>
+        <key>abilties</key>
+        <string>abilities</string>
+        <key>abilty</key>
+        <string>ability</string>
+        <key>abondon</key>
+        <string>abandon</string>
+        <key>abondoned</key>
+        <string>abandoned</string>
+        <key>abondoning</key>
+        <string>abandoning</string>
+        <key>abondons</key>
+        <string>abandons</string>
+        <key>aborigene</key>
+        <string>aborigine</string>
+        <key>abortificant</key>
+        <string>abortifacient</string>
+        <key>abreviate</key>
+        <string>abbreviate</string>
+        <key>abreviated</key>
+        <string>abbreviated</string>
+        <key>abreviation</key>
+        <string>abbreviation</string>
+        <key>abritrary</key>
+        <string>arbitrary</string>
+        <key>absail</key>
+        <string>abseil</string>
+        <key>absailing</key>
+        <string>abseiling</string>
+        <key>absense</key>
+        <string>absence</string>
+        <key>absolutly</key>
+        <string>absolutely</string>
+        <key>absorbsion</key>
+        <string>absorption</string>
+        <key>absorbtion</key>
+        <string>absorption</string>
+        <key>abundacies</key>
+        <string>abundances</string>
+        <key>abundancies</key>
+        <string>abundances</string>
+        <key>abundunt</key>
+        <string>abundant</string>
+        <key>abutts</key>
+        <string>abuts</string>
+        <key>acadamy</key>
+        <string>academy</string>
+        <key>acadmic</key>
+        <string>academic</string>
+        <key>accademic</key>
+        <string>academic</string>
+        <key>accademy</key>
+        <string>academy</string>
+        <key>acccused</key>
+        <string>accused</string>
+        <key>accelleration</key>
+        <string>acceleration</string>
+        <key>accension</key>
+        <string>ascension</string>
+        <key>acceptence</key>
+        <string>acceptance</string>
+        <key>acceptible</key>
+        <string>acceptable</string>
+        <key>accessable</key>
+        <string>accessible</string>
+        <key>accidentaly</key>
+        <string>accidentally</string>
+        <key>accidently</key>
+        <string>accidentally</string>
+        <key>acclimitization</key>
+        <string>acclimatization</string>
+        <key>accomadate</key>
+        <string>accommodate</string>
+        <key>accomadated</key>
+        <string>accommodated</string>
+        <key>accomadates</key>
+        <string>accommodates</string>
+        <key>accomadating</key>
+        <string>accommodating</string>
+        <key>accomadation</key>
+        <string>accommodation</string>
+        <key>accomadations</key>
+        <string>accommodations</string>
+        <key>accomdate</key>
+        <string>accommodate</string>
+        <key>accomodate</key>
+        <string>accommodate</string>
+        <key>accomodated</key>
+        <string>accommodated</string>
+        <key>accomodates</key>
+        <string>accommodates</string>
+        <key>accomodating</key>
+        <string>accommodating</string>
+        <key>accomodation</key>
+        <string>accommodation</string>
+        <key>accomodations</key>
+        <string>accommodations</string>
+        <key>accompanyed</key>
+        <string>accompanied</string>
+        <key>accordeon</key>
+        <string>accordion</string>
+        <key>accordian</key>
+        <string>accordion</string>
+        <key>accoring</key>
+        <string>according</string>
+        <key>accoustic</key>
+        <string>acoustic</string>
+        <key>accquainted</key>
+        <string>acquainted </string>
+        <key>accrediation</key>
+        <string>accreditation</string>
+        <key>accredidation</key>
+        <string>accreditation</string>
+        <key>accross</key>
+        <string>across</string>
+        <key>accussed</key>
+        <string>accused</string>
+        <key>acedemic</key>
+        <string>academic</string>
+        <key>acheive</key>
+        <string>achieve</string>
+        <key>acheived</key>
+        <string>achieved</string>
+        <key>acheivement</key>
+        <string>achievement</string>
+        <key>acheivements</key>
+        <string>achievements</string>
+        <key>acheives</key>
+        <string>achieves</string>
+        <key>acheiving</key>
+        <string>achieving</string>
+        <key>acheivment</key>
+        <string>achievement</string>
+        <key>acheivments</key>
+        <string>achievements</string>
+        <key>achievment</key>
+        <string>achievement</string>
+        <key>achievments</key>
+        <string>achievements</string>
+        <key>achivement</key>
+        <string>achievement</string>
+        <key>achivements</key>
+        <string>achievements</string>
+        <key>acknowldeged</key>
+        <string>acknowledged</string>
+        <key>acknowledgeing</key>
+        <string>acknowledging</string>
+        <key>ackward</key>
+        <string>awkward</string>
+        <key>acommodate</key>
+        <string>accommodate</string>
+        <key>acomplish</key>
+        <string>accomplish</string>
+        <key>acomplished</key>
+        <string>accomplished</string>
+        <key>acomplishment</key>
+        <string>accomplishment</string>
+        <key>acomplishments</key>
+        <string>accomplishments</string>
+        <key>acording</key>
+        <string>according</string>
+        <key>acordingly</key>
+        <string>accordingly</string>
+        <key>acquaintence</key>
+        <string>acquaintance</string>
+        <key>acquaintences</key>
+        <string>acquaintances</string>
+        <key>acquiantence</key>
+        <string>acquaintance</string>
+        <key>acquiantences</key>
+        <string>acquaintances</string>
+        <key>acquited</key>
+        <string>acquitted</string>
+        <key>activites</key>
+        <string>activities</string>
+        <key>activly</key>
+        <string>actively</string>
+        <key>actualy</key>
+        <string>actually</string>
+        <key>acuracy</key>
+        <string>accuracy</string>
+        <key>acused</key>
+        <string>accused</string>
+        <key>acustom</key>
+        <string>accustom</string>
+        <key>acustommed</key>
+        <string>accustomed</string>
+        <key>adavanced</key>
+        <string>advanced</string>
+        <key>adbandon</key>
+        <string>abandon</string>
+        <key>additinally</key>
+        <string>additionally</string>
+        <key>additionaly</key>
+        <string>additionally</string>
+        <key>additonal</key>
+        <string>additional</string>
+        <key>additonally</key>
+        <string>additionally</string>
+        <key>addmission</key>
+        <string>admission</string>
+        <key>addopt</key>
+        <string>adopt</string>
+        <key>addopted</key>
+        <string>adopted</string>
+        <key>addoptive</key>
+        <string>adoptive</string>
+        <key>addres</key>
+        <string>address</string>
+        <key>addresable</key>
+        <string>addressable</string>
+        <key>addresed</key>
+        <string>addressed</string>
+        <key>addresing</key>
+        <string>addressing</string>
+        <key>addressess</key>
+        <string>addresses</string>
+        <key>addtion</key>
+        <string>addition</string>
+        <key>addtional</key>
+        <string>additional</string>
+        <key>adecuate</key>
+        <string>adequate</string>
+        <key>adequit</key>
+        <string>adequate</string>
+        <key>adhearing</key>
+        <string>adhering</string>
+        <key>adherance</key>
+        <string>adherence</string>
+        <key>admendment</key>
+        <string>amendment</string>
+        <key>admininistrative</key>
+        <string>administrative</string>
+        <key>adminstered</key>
+        <string>administered</string>
+        <key>adminstrate</key>
+        <string>administrate</string>
+        <key>adminstration</key>
+        <string>administration</string>
+        <key>adminstrative</key>
+        <string>administrative</string>
+        <key>adminstrator</key>
+        <string>administrator</string>
+        <key>admissability</key>
+        <string>admissibility</string>
+        <key>admissable</key>
+        <string>admissible</string>
+        <key>admited</key>
+        <string>admitted</string>
+        <key>admitedly</key>
+        <string>admittedly</string>
+        <key>adn</key>
+        <string>and</string>
+        <key>adolecent</key>
+        <string>adolescent</string>
+        <key>adquire</key>
+        <string>acquire</string>
+        <key>adquired</key>
+        <string>acquired</string>
+        <key>adquires</key>
+        <string>acquires</string>
+        <key>adquiring</key>
+        <string>acquiring</string>
+        <key>adres</key>
+        <string>address</string>
+        <key>adresable</key>
+        <string>addressable</string>
+        <key>adresing</key>
+        <string>addressing</string>
+        <key>adress</key>
+        <string>address</string>
+        <key>adressable</key>
+        <string>addressable</string>
+        <key>adressed</key>
+        <string>addressed</string>
+        <key>adressing</key>
+        <string>addressing</string>
+        <key>adventrous</key>
+        <string>adventurous</string>
+        <key>advertisment</key>
+        <string>advertisement</string>
+        <key>advertisments</key>
+        <string>advertisements</string>
+        <key>advesary</key>
+        <string>adversary</string>
+        <key>adviced</key>
+        <string>advised</string>
+        <key>aeriel</key>
+        <string>aerial</string>
+        <key>aeriels</key>
+        <string>aerials</string>
+        <key>afair</key>
+        <string>affair</string>
+        <key>afficianados</key>
+        <string>aficionados</string>
+        <key>afficionado</key>
+        <string>aficionado</string>
+        <key>afficionados</key>
+        <string>aficionados</string>
+        <key>affilate</key>
+        <string>affiliate</string>
+        <key>affilliate</key>
+        <string>affiliate</string>
+        <key>affort</key>
+        <string>afford</string>
+        <key>aforememtioned</key>
+        <string>aforementioned</string>
+        <key>againnst</key>
+        <string>against</string>
+        <key>agains</key>
+        <string>against</string>
+        <key>agaisnt</key>
+        <string>against</string>
+        <key>aganist</key>
+        <string>against</string>
+        <key>aggaravates</key>
+        <string>aggravates</string>
+        <key>aggreed</key>
+        <string>agreed</string>
+        <key>aggreement</key>
+        <string>agreement</string>
+        <key>aggregious</key>
+        <string>egregious</string>
+        <key>aggresive</key>
+        <string>aggressive</string>
+        <key>agian</key>
+        <string>again</string>
+        <key>agianst</key>
+        <string>against</string>
+        <key>agin</key>
+        <string>again</string>
+        <key>agina</key>
+        <string>again</string>
+        <key>aginst</key>
+        <string>against</string>
+        <key>agravate</key>
+        <string>aggravate</string>
+        <key>agre</key>
+        <string>agree</string>
+        <key>agred</key>
+        <string>agreed</string>
+        <key>agreeement</key>
+        <string>agreement</string>
+        <key>agreemnt</key>
+        <string>agreement</string>
+        <key>agregate</key>
+        <string>aggregate</string>
+        <key>agregates</key>
+        <string>aggregates</string>
+        <key>agreing</key>
+        <string>agreeing</string>
+        <key>agression</key>
+        <string>aggression</string>
+        <key>agressive</key>
+        <string>aggressive</string>
+        <key>agressively</key>
+        <string>aggressively</string>
+        <key>agressor</key>
+        <string>aggressor</string>
+        <key>agricuture</key>
+        <string>agriculture</string>
+        <key>agrieved</key>
+        <string>aggrieved</string>
+        <key>ahev</key>
+        <string>have</string>
+        <key>ahppen</key>
+        <string>happen</string>
+        <key>ahve</key>
+        <string>have</string>
+        <key>aicraft</key>
+        <string>aircraft</string>
+        <key>aiport</key>
+        <string>airport</string>
+        <key>airbourne</key>
+        <string>airborne</string>
+        <key>aircaft</key>
+        <string>aircraft</string>
+        <key>aircrafts</key>
+        <string>aircraft</string>
+        <key>airporta</key>
+        <string>airports</string>
+        <key>airrcraft</key>
+        <string>aircraft</string>
+        <key>aisian</key>
+        <string>asian</string>
+        <key>albiet</key>
+        <string>albeit</string>
+        <key>alchohol</key>
+        <string>alcohol</string>
+        <key>alchoholic</key>
+        <string>alcoholic</string>
+        <key>alchol</key>
+        <string>alcohol</string>
+        <key>alcholic</key>
+        <string>alcoholic</string>
+        <key>alcohal</key>
+        <string>alcohol</string>
+        <key>alcoholical</key>
+        <string>alcoholic</string>
+        <key>aledge</key>
+        <string>allege</string>
+        <key>aledged</key>
+        <string>alleged</string>
+        <key>aledges</key>
+        <string>alleges</string>
+        <key>alege</key>
+        <string>allege</string>
+        <key>aleged</key>
+        <string>alleged</string>
+        <key>alegience</key>
+        <string>allegiance</string>
+        <key>algebraical</key>
+        <string>algebraic</string>
+        <key>algorhitms</key>
+        <string>algorithms</string>
+        <key>algoritm</key>
+        <string>algorithm</string>
+        <key>algoritms</key>
+        <string>algorithms</string>
+        <key>alientating</key>
+        <string>alienating</string>
+        <key>alledge</key>
+        <string>allege</string>
+        <key>alledged</key>
+        <string>alleged</string>
+        <key>alledgedly</key>
+        <string>allegedly</string>
+        <key>alledges</key>
+        <string>alleges</string>
+        <key>allegedely</key>
+        <string>allegedly</string>
+        <key>allegedy</key>
+        <string>allegedly</string>
+        <key>allegely</key>
+        <string>allegedly</string>
+        <key>allegence</key>
+        <string>allegiance</string>
+        <key>allegience</key>
+        <string>allegiance</string>
+        <key>allign</key>
+        <string>align</string>
+        <key>alligned</key>
+        <string>aligned</string>
+        <key>alliviate</key>
+        <string>alleviate</string>
+        <key>allopone</key>
+        <string>allophone</string>
+        <key>allopones</key>
+        <string>allophones</string>
+        <key>allready</key>
+        <string>already</string>
+        <key>allthough</key>
+        <string>although</string>
+        <key>alltime</key>
+        <string>all-time</string>
+        <key>alltogether</key>
+        <string>altogether</string>
+        <key>almsot</key>
+        <string>almost</string>
+        <key>alochol</key>
+        <string>alcohol</string>
+        <key>alomst</key>
+        <string>almost</string>
+        <key>alot</key>
+        <string>a lot</string>
+        <key>alotted</key>
+        <string>allotted</string>
+        <key>alowed</key>
+        <string>allowed</string>
+        <key>alowing</key>
+        <string>allowing</string>
+        <key>alreayd</key>
+        <string>already</string>
+        <key>alse</key>
+        <string>else</string>
+        <key>alsot</key>
+        <string>also</string>
+        <key>alternitives</key>
+        <string>alternatives</string>
+        <key>altho</key>
+        <string>although</string>
+        <key>althought</key>
+        <string>although</string>
+        <key>altough</key>
+        <string>although</string>
+        <key>alusion</key>
+        <string>allusion</string>
+        <key>alwasy</key>
+        <string>always</string>
+        <key>alwyas</key>
+        <string>always</string>
+        <key>amalgomated</key>
+        <string>amalgamated</string>
+        <key>amatuer</key>
+        <string>amateur</string>
+        <key>amature</key>
+        <string>armature</string>
+        <key>amendmant</key>
+        <string>amendment</string>
+        <key>amerliorate</key>
+        <string>ameliorate</string>
+        <key>amke</key>
+        <string>make</string>
+        <key>amking</key>
+        <string>making</string>
+        <key>ammend</key>
+        <string>amend</string>
+        <key>ammended</key>
+        <string>amended</string>
+        <key>ammendment</key>
+        <string>amendment</string>
+        <key>ammendments</key>
+        <string>amendments</string>
+        <key>ammount</key>
+        <string>amount</string>
+        <key>ammused</key>
+        <string>amused</string>
+        <key>amoung</key>
+        <string>among</string>
+        <key>amoungst</key>
+        <string>amongst</string>
+        <key>amung</key>
+        <string>among</string>
+        <key>amunition</key>
+        <string>ammunition</string>
+        <key>analagous</key>
+        <string>analogous</string>
+        <key>analitic</key>
+        <string>analytic</string>
+        <key>analogeous</key>
+        <string>analogous</string>
+        <key>anarchim</key>
+        <string>anarchism</string>
+        <key>anarchistm</key>
+        <string>anarchism</string>
+        <key>anbd</key>
+        <string>and</string>
+        <key>ancestory</key>
+        <string>ancestry</string>
+        <key>ancilliary</key>
+        <string>ancillary</string>
+        <key>androgenous</key>
+        <string>androgynous</string>
+        <key>androgeny</key>
+        <string>androgyny</string>
+        <key>anihilation</key>
+        <string>annihilation</string>
+        <key>aniversary</key>
+        <string>anniversary</string>
+        <key>annoint</key>
+        <string>anoint</string>
+        <key>annointed</key>
+        <string>anointed</string>
+        <key>annointing</key>
+        <string>anointing</string>
+        <key>annoints</key>
+        <string>anoints</string>
+        <key>annouced</key>
+        <string>announced</string>
+        <key>annualy</key>
+        <string>annually</string>
+        <key>annuled</key>
+        <string>annulled</string>
+        <key>anohter</key>
+        <string>another</string>
+        <key>anomolies</key>
+        <string>anomalies</string>
+        <key>anomolous</key>
+        <string>anomalous</string>
+        <key>anomoly</key>
+        <string>anomaly</string>
+        <key>anonimity</key>
+        <string>anonymity</string>
+        <key>anounced</key>
+        <string>announced</string>
+        <key>anouncement</key>
+        <string>announcement</string>
+        <key>ansalisation</key>
+        <string>nasalisation</string>
+        <key>ansalization</key>
+        <string>nasalization</string>
+        <key>ansestors</key>
+        <string>ancestors</string>
+        <key>antartic</key>
+        <string>antarctic</string>
+        <key>anthromorphization</key>
+        <string>anthropomorphization</string>
+        <key>anthropolgist</key>
+        <string>anthropologist</string>
+        <key>anthropolgy</key>
+        <string>anthropology</string>
+        <key>anual</key>
+        <string>annual</string>
+        <key>anulled</key>
+        <string>annulled</string>
+        <key>anwsered</key>
+        <string>answered</string>
+        <key>anyhwere</key>
+        <string>anywhere</string>
+        <key>anyother</key>
+        <string>any other</string>
+        <key>anytying</key>
+        <string>anything</string>
+        <key>aparent</key>
+        <string>apparent</string>
+        <key>aparment</key>
+        <string>apartment</string>
+        <key>apenines</key>
+        <string>apennines</string>
+        <key>aplication</key>
+        <string>application</string>
+        <key>aplied</key>
+        <string>applied</string>
+        <key>apolegetics</key>
+        <string>apologetics</string>
+        <key>apon</key>
+        <string>apron</string>
+        <key>apparant</key>
+        <string>apparent</string>
+        <key>apparantly</key>
+        <string>apparently</string>
+        <key>appart</key>
+        <string>apart</string>
+        <key>appartment</key>
+        <string>apartment</string>
+        <key>appartments</key>
+        <string>apartments</string>
+        <key>appealling</key>
+        <string>appealing</string>
+        <key>appeareance</key>
+        <string>appearance</string>
+        <key>appearence</key>
+        <string>appearance</string>
+        <key>appearences</key>
+        <string>appearances</string>
+        <key>apperance</key>
+        <string>appearance</string>
+        <key>apperances</key>
+        <string>appearances</string>
+        <key>appereance</key>
+        <string>appearance</string>
+        <key>appereances</key>
+        <string>appearances</string>
+        <key>applicaiton</key>
+        <string>application</string>
+        <key>applicaitons</key>
+        <string>applications</string>
+        <key>appologies</key>
+        <string>apologies</string>
+        <key>appology</key>
+        <string>apology</string>
+        <key>apprearance</key>
+        <string>appearance</string>
+        <key>apprieciate</key>
+        <string>appreciate</string>
+        <key>approachs</key>
+        <string>approaches</string>
+        <key>appropiate</key>
+        <string>appropriate</string>
+        <key>appropraite</key>
+        <string>appropriate</string>
+        <key>appropropiate</key>
+        <string>appropriate</string>
+        <key>approproximate</key>
+        <string>approximate</string>
+        <key>approxamately</key>
+        <string>approximately</string>
+        <key>approxiately</key>
+        <string>approximately</string>
+        <key>approximitely</key>
+        <string>approximately</string>
+        <key>aprehensive</key>
+        <string>apprehensive</string>
+        <key>apropriate</key>
+        <string>appropriate</string>
+        <key>aproximate</key>
+        <string>approximate</string>
+        <key>aproximately</key>
+        <string>approximately</string>
+        <key>aquaduct</key>
+        <string>aqueduct</string>
+        <key>aquaintance</key>
+        <string>acquaintance</string>
+        <key>aquainted</key>
+        <string>acquainted</string>
+        <key>aquiantance</key>
+        <string>acquaintance</string>
+        <key>aquire</key>
+        <string>acquire</string>
+        <key>aquired</key>
+        <string>acquired</string>
+        <key>aquiring</key>
+        <string>acquiring</string>
+        <key>aquisition</key>
+        <string>acquisition</string>
+        <key>aquitted</key>
+        <string>acquitted</string>
+        <key>aranged</key>
+        <string>arranged</string>
+        <key>arangement</key>
+        <string>arrangement</string>
+        <key>arbitarily</key>
+        <string>arbitrarily</string>
+        <key>arbitary</key>
+        <string>arbitrary</string>
+        <key>archaelogists</key>
+        <string>archaeologists</string>
+        <key>archaelogy</key>
+        <string>archaeology</string>
+        <key>archaoelogy</key>
+        <string>archaeology</string>
+        <key>archaology</key>
+        <string>archaeology</string>
+        <key>archeaologist</key>
+        <string>archaeologist</string>
+        <key>archeaologists</key>
+        <string>archaeologists</string>
+        <key>archetect</key>
+        <string>architect</string>
+        <key>archetects</key>
+        <string>architects</string>
+        <key>archetectural</key>
+        <string>architectural</string>
+        <key>archetecturally</key>
+        <string>architecturally</string>
+        <key>archetecture</key>
+        <string>architecture</string>
+        <key>archiac</key>
+        <string>archaic</string>
+        <key>archictect</key>
+        <string>architect</string>
+        <key>archimedian</key>
+        <string>archimedean</string>
+        <key>architecht</key>
+        <string>architect</string>
+        <key>architechturally</key>
+        <string>architecturally</string>
+        <key>architechture</key>
+        <string>architecture</string>
+        <key>architechtures</key>
+        <string>architectures</string>
+        <key>architectual</key>
+        <string>architectural</string>
+        <key>archtype</key>
+        <string>archetype</string>
+        <key>archtypes</key>
+        <string>archetypes</string>
+        <key>aready</key>
+        <string>already</string>
+        <key>areodynamics</key>
+        <string>aerodynamics</string>
+        <key>argubly</key>
+        <string>arguably</string>
+        <key>arguement</key>
+        <string>argument</string>
+        <key>arguements</key>
+        <string>arguments</string>
+        <key>arised</key>
+        <string>arose</string>
+        <key>arival</key>
+        <string>arrival</string>
+        <key>armamant</key>
+        <string>armament</string>
+        <key>armistace</key>
+        <string>armistice</string>
+        <key>arogant</key>
+        <string>arrogant</string>
+        <key>arogent</key>
+        <string>arrogant</string>
+        <key>aroud</key>
+        <string>around</string>
+        <key>arrangment</key>
+        <string>arrangement</string>
+        <key>arrangments</key>
+        <string>arrangements</string>
+        <key>arround</key>
+        <string>around</string>
+        <key>artical</key>
+        <string>article</string>
+        <key>artice</key>
+        <string>article</string>
+        <key>articel</key>
+        <string>article</string>
+        <key>artifical</key>
+        <string>artificial</string>
+        <key>artifically</key>
+        <string>artificially</string>
+        <key>artillary</key>
+        <string>artillery</string>
+        <key>arund</key>
+        <string>around</string>
+        <key>asetic</key>
+        <string>ascetic</string>
+        <key>asfar</key>
+        <string>as far</string>
+        <key>asign</key>
+        <string>assign</string>
+        <key>aslo</key>
+        <string>also</string>
+        <key>asociated</key>
+        <string>associated</string>
+        <key>asorbed</key>
+        <string>absorbed</string>
+        <key>asphyxation</key>
+        <string>asphyxiation</string>
+        <key>assasin</key>
+        <string>assassin</string>
+        <key>assasinate</key>
+        <string>assassinate</string>
+        <key>assasinated</key>
+        <string>assassinated</string>
+        <key>assasinates</key>
+        <string>assassinates</string>
+        <key>assasination</key>
+        <string>assassination</string>
+        <key>assasinations</key>
+        <string>assassinations</string>
+        <key>assasined</key>
+        <string>assassinated</string>
+        <key>assasins</key>
+        <string>assassins</string>
+        <key>assassintation</key>
+        <string>assassination</string>
+        <key>assemple</key>
+        <string>assemble</string>
+        <key>assertation</key>
+        <string>assertion</string>
+        <key>asside</key>
+        <string>aside</string>
+        <key>assisnate</key>
+        <string>assassinate</string>
+        <key>assit</key>
+        <string>assist</string>
+        <key>assitant</key>
+        <string>assistant</string>
+        <key>assocation</key>
+        <string>association</string>
+        <key>assoicate</key>
+        <string>associate</string>
+        <key>assoicated</key>
+        <string>associated</string>
+        <key>assoicates</key>
+        <string>associates</string>
+        <key>assosication</key>
+        <string>assassination</string>
+        <key>asssassans</key>
+        <string>assassins</string>
+        <key>assualt</key>
+        <string>assault</string>
+        <key>assualted</key>
+        <string>assaulted</string>
+        <key>assymetric</key>
+        <string>asymmetric</string>
+        <key>assymetrical</key>
+        <string>asymmetrical</string>
+        <key>asteriod</key>
+        <string>asteroid</string>
+        <key>asthetic</key>
+        <string>aesthetic</string>
+        <key>asthetical</key>
+        <string>aesthetical</string>
+        <key>asthetically</key>
+        <string>aesthetically</string>
+        <key>asume</key>
+        <string>assume</string>
+        <key>aswell</key>
+        <string>as well</string>
+        <key>atain</key>
+        <string>attain</string>
+        <key>atempting</key>
+        <string>attempting</string>
+        <key>atheistical</key>
+        <string>atheistic</string>
+        <key>athenean</key>
+        <string>athenian</string>
+        <key>atheneans</key>
+        <string>athenians</string>
+        <key>athiesm</key>
+        <string>atheism</string>
+        <key>athiest</key>
+        <string>atheist</string>
+        <key>atorney</key>
+        <string>attorney</string>
+        <key>atribute</key>
+        <string>attribute</string>
+        <key>atributed</key>
+        <string>attributed</string>
+        <key>atributes</key>
+        <string>attributes</string>
+        <key>attaindre</key>
+        <string>attainder</string>
+        <key>attemp</key>
+        <string>attempt</string>
+        <key>attemped</key>
+        <string>attempted</string>
+        <key>attemt</key>
+        <string>attempt</string>
+        <key>attemted</key>
+        <string>attempted</string>
+        <key>attemting</key>
+        <string>attempting</string>
+        <key>attemts</key>
+        <string>attempts</string>
+        <key>attendence</key>
+        <string>attendance</string>
+        <key>attendent</key>
+        <string>attendant</string>
+        <key>attendents</key>
+        <string>attendants</string>
+        <key>attened</key>
+        <string>attended</string>
+        <key>attension</key>
+        <string>attention</string>
+        <key>attitide</key>
+        <string>attitude</string>
+        <key>attributred</key>
+        <string>attributed</string>
+        <key>attrocities</key>
+        <string>atrocities</string>
+        <key>audeince</key>
+        <string>audience</string>
+        <key>auromated</key>
+        <string>automated</string>
+        <key>austrailia</key>
+        <string>Australia</string>
+        <key>austrailian</key>
+        <string>Australian</string>
+        <key>auther</key>
+        <string>author</string>
+        <key>authobiographic</key>
+        <string>autobiographic</string>
+        <key>authobiography</key>
+        <string>autobiography</string>
+        <key>authorative</key>
+        <string>authoritative</string>
+        <key>authorites</key>
+        <string>authorities</string>
+        <key>authorithy</key>
+        <string>authority</string>
+        <key>authoritiers</key>
+        <string>authorities</string>
+        <key>authoritive</key>
+        <string>authoritative</string>
+        <key>authrorities</key>
+        <string>authorities</string>
+        <key>autochtonous</key>
+        <string>autochthonous</string>
+        <key>autoctonous</key>
+        <string>autochthonous</string>
+        <key>automaticly</key>
+        <string>automatically</string>
+        <key>automibile</key>
+        <string>automobile</string>
+        <key>automonomous</key>
+        <string>autonomous</string>
+        <key>autor</key>
+        <string>author</string>
+        <key>autority</key>
+        <string>authority</string>
+        <key>auxilary</key>
+        <string>auxiliary</string>
+        <key>auxillaries</key>
+        <string>auxiliaries</string>
+        <key>auxillary</key>
+        <string>auxiliary</string>
+        <key>auxilliaries</key>
+        <string>auxiliaries</string>
+        <key>auxilliary</key>
+        <string>auxiliary</string>
+        <key>availabe</key>
+        <string> available</string>
+        <key>availablity</key>
+        <string>availability</string>
+        <key>availaible</key>
+        <string>available</string>
+        <key>availble</key>
+        <string>available</string>
+        <key>availiable</key>
+        <string>available</string>
+        <key>availible</key>
+        <string>available</string>
+        <key>avalable</key>
+        <string>available</string>
+        <key>avalance</key>
+        <string>avalanche</string>
+        <key>avaliable</key>
+        <string>available</string>
+        <key>avation</key>
+        <string>aviation</string>
+        <key>avengence</key>
+        <string>a vengeance</string>
+        <key>averageed</key>
+        <string>averaged</string>
+        <key>avilable</key>
+        <string>available</string>
+        <key>awared</key>
+        <string>awarded</string>
+        <key>awya</key>
+        <string>away</string>
+        <key>baceause</key>
+        <string>because</string>
+        <key>backgorund</key>
+        <string>background</string>
+        <key>backrounds</key>
+        <string>backgrounds</string>
+        <key>bakc</key>
+        <string>back</string>
+        <key>banannas</key>
+        <string>bananas</string>
+        <key>bandwith</key>
+        <string>bandwidth</string>
+        <key>bankrupcy</key>
+        <string>bankruptcy</string>
+        <key>banruptcy</key>
+        <string>bankruptcy</string>
+        <key>baout</key>
+        <string>about</string>
+        <key>basicaly</key>
+        <string>basically</string>
+        <key>basicly</key>
+        <string>basically</string>
+        <key>bcak</key>
+        <string>back</string>
+        <key>beachead</key>
+        <string>beachhead</string>
+        <key>beacuse</key>
+        <string>because</string>
+        <key>beastiality</key>
+        <string>bestiality</string>
+        <key>beatiful</key>
+        <string>beautiful</string>
+        <key>beaurocracy</key>
+        <string>bureaucracy</string>
+        <key>beaurocratic</key>
+        <string>bureaucratic</string>
+        <key>beautyfull</key>
+        <string>beautiful</string>
+        <key>becamae</key>
+        <string>became</string>
+        <key>becames</key>
+        <string>becomes</string>
+        <key>becasue</key>
+        <string>because</string>
+        <key>beccause</key>
+        <string>because</string>
+        <key>becomeing</key>
+        <string>becoming</string>
+        <key>becomming</key>
+        <string>becoming</string>
+        <key>becouse</key>
+        <string>because</string>
+        <key>becuase</key>
+        <string>because</string>
+        <key>bedore</key>
+        <string>before</string>
+        <key>befoer</key>
+        <string>before</string>
+        <key>beggin</key>
+        <string>begin</string>
+        <key>begginer</key>
+        <string>beginner</string>
+        <key>begginers</key>
+        <string>beginners</string>
+        <key>beggining</key>
+        <string>beginning</string>
+        <key>begginings</key>
+        <string>beginnings</string>
+        <key>beggins</key>
+        <string>begins</string>
+        <key>begining</key>
+        <string>beginning</string>
+        <key>beginnig</key>
+        <string>beginning</string>
+        <key>behavour</key>
+        <string>behavior</string>
+        <key>beleagured</key>
+        <string>beleaguered</string>
+        <key>beleif</key>
+        <string>belief</string>
+        <key>beleive</key>
+        <string>believe</string>
+        <key>beleived</key>
+        <string>believed</string>
+        <key>beleives</key>
+        <string>believes</string>
+        <key>beleiving</key>
+        <string>believing</string>
+        <key>beligum</key>
+        <string>belgium</string>
+        <key>belive</key>
+        <string>believe</string>
+        <key>belived</key>
+        <string>believed</string>
+        <key>belives</key>
+        <string>believes</string>
+        <key>belligerant</key>
+        <string>belligerent</string>
+        <key>bellweather</key>
+        <string>bellwether</string>
+        <key>bemusemnt</key>
+        <string>bemusement</string>
+        <key>beneficary</key>
+        <string>beneficiary</string>
+        <key>beng</key>
+        <string>being</string>
+        <key>benificial</key>
+        <string>beneficial</string>
+        <key>benifit</key>
+        <string>benefit</string>
+        <key>benifits</key>
+        <string>benefits</string>
+        <key>bergamont</key>
+        <string>bergamot</string>
+        <key>beseige</key>
+        <string>besiege</string>
+        <key>beseiged</key>
+        <string>besieged</string>
+        <key>beseiging</key>
+        <string>besieging</string>
+        <key>betwen</key>
+        <string>between</string>
+        <key>beween</key>
+        <string>between</string>
+        <key>bewteen</key>
+        <string>between</string>
+        <key>bilateraly</key>
+        <string>bilaterally</string>
+        <key>billingualism</key>
+        <string>bilingualism</string>
+        <key>binominal</key>
+        <string>binomial</string>
+        <key>bizzare</key>
+        <string>bizarre</string>
+        <key>blaim</key>
+        <string>blame</string>
+        <key>blaimed</key>
+        <string>blamed</string>
+        <key>blessure</key>
+        <string>blessing</string>
+        <key>bodydbuilder</key>
+        <string>bodybuilder</string>
+        <key>bombardement</key>
+        <string>bombardment</string>
+        <key>bombarment</key>
+        <string>bombardment</string>
+        <key>bondary</key>
+        <string>boundary</string>
+        <key>borke</key>
+        <string>broke</string>
+        <key>boundry</key>
+        <string>boundary</string>
+        <key>bouyancy</key>
+        <string>buoyancy</string>
+        <key>bouyant</key>
+        <string>buoyant</string>
+        <key>boyant</key>
+        <string>buoyant</string>
+        <key>breakthough</key>
+        <string>breakthrough</string>
+        <key>breakthroughts</key>
+        <string>breakthroughs</string>
+        <key>breif</key>
+        <string>brief</string>
+        <key>breifly</key>
+        <string>briefly</string>
+        <key>brethen</key>
+        <string>brethren</string>
+        <key>bretheren</key>
+        <string>brethren</string>
+        <key>briliant</key>
+        <string>brilliant</string>
+        <key>brillant</key>
+        <string>brilliant</string>
+        <key>brimestone</key>
+        <string>brimstone</string>
+        <key>broacasted</key>
+        <string>broadcast</string>
+        <key>broadacasting</key>
+        <string>broadcasting</string>
+        <key>broady</key>
+        <string>broadly</string>
+        <key>buisness</key>
+        <string>business</string>
+        <key>buisnessman</key>
+        <string>businessman</string>
+        <key>buoancy</key>
+        <string>buoyancy</string>
+        <key>burried</key>
+        <string>buried</string>
+        <key>busineses</key>
+        <string>businesses</string>
+        <key>busness</key>
+        <string>business</string>
+        <key>bussiness</key>
+        <string>business</string>
+        <key>caculater</key>
+        <string>calculator</string>
+        <key>cacuses</key>
+        <string>caucuses</string>
+        <key>cahracters</key>
+        <string>characters</string>
+        <key>calaber</key>
+        <string>caliber</string>
+        <key>calculater</key>
+        <string>calculator</string>
+        <key>calculs</key>
+        <string>calculus</string>
+        <key>calenders</key>
+        <string>calendars</string>
+        <key>caligraphy</key>
+        <string>calligraphy</string>
+        <key>caluclate</key>
+        <string>calculate</string>
+        <key>caluclated</key>
+        <string>calculated</string>
+        <key>caluculate</key>
+        <string>calculate</string>
+        <key>caluculated</key>
+        <string>calculated</string>
+        <key>calulate</key>
+        <string>calculate</string>
+        <key>calulated</key>
+        <string>calculated</string>
+        <key>calulater</key>
+        <string>calculator</string>
+        <key>camoflage</key>
+        <string>camouflage</string>
+        <key>campain</key>
+        <string>campaign</string>
+        <key>campains</key>
+        <string>campaigns</string>
+        <key>candadate</key>
+        <string>candidate</string>
+        <key>candiate</key>
+        <string>candidate</string>
+        <key>candidiate</key>
+        <string>candidate</string>
+        <key>cannister</key>
+        <string>canister</string>
+        <key>cannisters</key>
+        <string>canisters</string>
+        <key>cannnot</key>
+        <string>cannot</string>
+        <key>cannonical</key>
+        <string>canonical</string>
+        <key>cannotation</key>
+        <string>connotation</string>
+        <key>cannotations</key>
+        <string>connotations</string>
+        <key>cant</key>
+        <string>can&apos;t</string>
+        <key>caost</key>
+        <string>coast</string>
+        <key>caperbility</key>
+        <string>capability</string>
+        <key>capible</key>
+        <string>capable</string>
+        <key>captial</key>
+        <string>capital</string>
+        <key>captued</key>
+        <string>captured</string>
+        <key>capturd</key>
+        <string>captured</string>
+        <key>carachter</key>
+        <string>character</string>
+        <key>caracterized</key>
+        <string>characterized</string>
+        <key>carcas</key>
+        <string>carcass</string>
+        <key>carefull</key>
+        <string>careful</string>
+        <key>careing</key>
+        <string>caring</string>
+        <key>carismatic</key>
+        <string>charismatic</string>
+        <key>carnege</key>
+        <string>carnage</string>
+        <key>carnige</key>
+        <string>carnage</string>
+        <key>carniverous</key>
+        <string>carnivorous</string>
+        <key>carreer</key>
+        <string>career</string>
+        <key>carrers</key>
+        <string>careers</string>
+        <key>cartdridge</key>
+        <string>cartridge</string>
+        <key>carthographer</key>
+        <string>cartographer</string>
+        <key>cartilege</key>
+        <string>cartilage</string>
+        <key>cartilidge</key>
+        <string>cartilage</string>
+        <key>cartrige</key>
+        <string>cartridge</string>
+        <key>casette</key>
+        <string>cassette</string>
+        <key>casion</key>
+        <string>caisson</string>
+        <key>cassawory</key>
+        <string>cassowary</string>
+        <key>cassowarry</key>
+        <string>cassowary</string>
+        <key>casulaties</key>
+        <string>casualties</string>
+        <key>casulaty</key>
+        <string>casualty</string>
+        <key>catagories</key>
+        <string>categories</string>
+        <key>catagorized</key>
+        <string>categorized</string>
+        <key>catagory</key>
+        <string>category</string>
+        <key>catapillar</key>
+        <string>caterpillar</string>
+        <key>catapillars</key>
+        <string>caterpillars</string>
+        <key>catapiller</key>
+        <string>caterpillar</string>
+        <key>catapillers</key>
+        <string>caterpillars</string>
+        <key>catepillar</key>
+        <string>caterpillar</string>
+        <key>catepillars</key>
+        <string>caterpillars</string>
+        <key>catergorize</key>
+        <string>categorize</string>
+        <key>catergorized</key>
+        <string>categorized</string>
+        <key>caterpilar</key>
+        <string>caterpillar</string>
+        <key>caterpilars</key>
+        <string>caterpillars</string>
+        <key>caterpiller</key>
+        <string>caterpillar</string>
+        <key>caterpillers</key>
+        <string>caterpillars</string>
+        <key>cathlic</key>
+        <string>catholic</string>
+        <key>catholocism</key>
+        <string>catholicism</string>
+        <key>catterpilar</key>
+        <string>caterpillar</string>
+        <key>catterpilars</key>
+        <string>caterpillars</string>
+        <key>catterpillar</key>
+        <string>caterpillar</string>
+        <key>catterpillars</key>
+        <string>caterpillars</string>
+        <key>cattleship</key>
+        <string>battleship</string>
+        <key>causalities</key>
+        <string>casualties</string>
+        <key>cellpading</key>
+        <string>cellpadding</string>
+        <key>cementary</key>
+        <string>cemetery</string>
+        <key>cemetarey</key>
+        <string>cemetery</string>
+        <key>cemetaries</key>
+        <string>cemeteries</string>
+        <key>cemetary</key>
+        <string>cemetery</string>
+        <key>cencus</key>
+        <string>census</string>
+        <key>censur</key>
+        <string>censor</string>
+        <key>cententenial</key>
+        <string>centennial</string>
+        <key>centruies</key>
+        <string>centuries</string>
+        <key>centruy</key>
+        <string>century</string>
+        <key>ceratin</key>
+        <string>certain</string>
+        <key>cerimonial</key>
+        <string>ceremonial</string>
+        <key>cerimonies</key>
+        <string>ceremonies</string>
+        <key>cerimonious</key>
+        <string>ceremonious</string>
+        <key>cerimony</key>
+        <string>ceremony</string>
+        <key>ceromony</key>
+        <string>ceremony</string>
+        <key>certainity</key>
+        <string>certainty</string>
+        <key>certian</key>
+        <string>certain</string>
+        <key>chalenging</key>
+        <string>challenging</string>
+        <key>challange</key>
+        <string>challenge</string>
+        <key>challanged</key>
+        <string>challenged</string>
+        <key>challege</key>
+        <string>challenge</string>
+        <key>changable</key>
+        <string>changeable</string>
+        <key>charachter</key>
+        <string>character</string>
+        <key>charachters</key>
+        <string>characters</string>
+        <key>charactersistic</key>
+        <string>characteristic</string>
+        <key>charactor</key>
+        <string>character </string>
+        <key>charactors</key>
+        <string>characters</string>
+        <key>charasmatic</key>
+        <string>charismatic</string>
+        <key>charaterized</key>
+        <string>characterized</string>
+        <key>chariman</key>
+        <string>chairman</string>
+        <key>charistics</key>
+        <string>characteristics</string>
+        <key>cheif</key>
+        <string>chief</string>
+        <key>cheifs</key>
+        <string>chiefs</string>
+        <key>chemcial</key>
+        <string>chemical</string>
+        <key>chemcially</key>
+        <string>chemically</string>
+        <key>chemestry</key>
+        <string>chemistry</string>
+        <key>chemicaly</key>
+        <string>chemically</string>
+        <key>childbird</key>
+        <string>childbirth</string>
+        <key>childen</key>
+        <string>children</string>
+        <key>choosen</key>
+        <string>chosen</string>
+        <key>chracter</key>
+        <string>character</string>
+        <key>chuch</key>
+        <string>church</string>
+        <key>churchs</key>
+        <string>churches</string>
+        <key>circulaton</key>
+        <string>circulation</string>
+        <key>circumsicion</key>
+        <string>circumcision</string>
+        <key>circut</key>
+        <string>circuit</string>
+        <key>ciricuit</key>
+        <string>circuit</string>
+        <key>ciriculum</key>
+        <string>curriculum</string>
+        <key>civillian</key>
+        <string>civilian</string>
+        <key>claer</key>
+        <string>clear</string>
+        <key>claerer</key>
+        <string>clearer</string>
+        <key>claerly</key>
+        <string>clearly</string>
+        <key>claimes</key>
+        <string>claims</string>
+        <key>clas</key>
+        <string>class</string>
+        <key>clasic</key>
+        <string>classic</string>
+        <key>clasical</key>
+        <string>classical</string>
+        <key>clasically</key>
+        <string>classically</string>
+        <key>cleareance</key>
+        <string>clearance</string>
+        <key>clera</key>
+        <string>clear</string>
+        <key>clincial</key>
+        <string>clinical</string>
+        <key>clinicaly</key>
+        <string>clinically</string>
+        <key>cmo</key>
+        <string>com</string>
+        <key>cmoputer</key>
+        <string>computer</string>
+        <key>co-incided</key>
+        <string>coincided</string>
+        <key>coctail</key>
+        <string>cocktail</string>
+        <key>coform</key>
+        <string>conform</string>
+        <key>cognizent</key>
+        <string>cognizant</string>
+        <key>coincedentally</key>
+        <string>coincidentally</string>
+        <key>colaborations</key>
+        <string>collaborations</string>
+        <key>colateral</key>
+        <string>collateral</string>
+        <key>colelctive</key>
+        <string>collective</string>
+        <key>collaberative</key>
+        <string>collaborative</string>
+        <key>collecton</key>
+        <string>collection</string>
+        <key>collegue</key>
+        <string>colleague</string>
+        <key>collegues</key>
+        <string>colleagues</string>
+        <key>collonade</key>
+        <string>colonnade</string>
+        <key>collonies</key>
+        <string>colonies</string>
+        <key>collony</key>
+        <string>colony </string>
+        <key>collosal</key>
+        <string>colossal</string>
+        <key>colonizators</key>
+        <string>colonizers</string>
+        <key>comander</key>
+        <string>commander</string>
+        <key>comando</key>
+        <string>commando</string>
+        <key>comandos</key>
+        <string>commandos</string>
+        <key>comany</key>
+        <string>company</string>
+        <key>comapany</key>
+        <string>company</string>
+        <key>comback</key>
+        <string>comeback</string>
+        <key>combanations</key>
+        <string>combinations</string>
+        <key>combinatins</key>
+        <string>combinations</string>
+        <key>combusion</key>
+        <string>combustion</string>
+        <key>comdemnation</key>
+        <string>condemnation</string>
+        <key>comemmorates</key>
+        <string>commemorates</string>
+        <key>comemoretion</key>
+        <string>commemoration</string>
+        <key>comision</key>
+        <string>commission</string>
+        <key>comisioned</key>
+        <string>commissioned</string>
+        <key>comisioner</key>
+        <string>commissioner</string>
+        <key>comisioning</key>
+        <string>commissioning</string>
+        <key>comisions</key>
+        <string>commissions</string>
+        <key>comission</key>
+        <string>commission</string>
+        <key>comissioned</key>
+        <string>commissioned</string>
+        <key>comissioner</key>
+        <string>commissioner</string>
+        <key>comissioning</key>
+        <string>commissioning</string>
+        <key>comissions</key>
+        <string>commissions</string>
+        <key>comited</key>
+        <string>committed</string>
+        <key>comiting</key>
+        <string>committing</string>
+        <key>comitted</key>
+        <string>committed</string>
+        <key>comittee</key>
+        <string>committee</string>
+        <key>comitting</key>
+        <string>committing</string>
+        <key>commandoes</key>
+        <string>commandos</string>
+        <key>commedic</key>
+        <string>comedic</string>
+        <key>commemerative</key>
+        <string>commemorative</string>
+        <key>commemmorate</key>
+        <string>commemorate</string>
+        <key>commemmorating</key>
+        <string>commemorating</string>
+        <key>commerical</key>
+        <string>commercial</string>
+        <key>commerically</key>
+        <string>commercially</string>
+        <key>commericial</key>
+        <string>commercial</string>
+        <key>commericially</key>
+        <string>commercially</string>
+        <key>commerorative</key>
+        <string>commemorative</string>
+        <key>comming</key>
+        <string>coming</string>
+        <key>comminication</key>
+        <string>communication</string>
+        <key>commision</key>
+        <string>commission</string>
+        <key>commisioned</key>
+        <string>commissioned</string>
+        <key>commisioner</key>
+        <string>commissioner</string>
+        <key>commisioning</key>
+        <string>commissioning</string>
+        <key>commisions</key>
+        <string>commissions</string>
+        <key>commited</key>
+        <string>committed</string>
+        <key>commitee</key>
+        <string>committee</string>
+        <key>commiting</key>
+        <string>committing</string>
+        <key>committe</key>
+        <string>committee</string>
+        <key>committment</key>
+        <string>commitment</string>
+        <key>committments</key>
+        <string>commitments</string>
+        <key>commmemorated</key>
+        <string>commemorated</string>
+        <key>commongly</key>
+        <string>commonly</string>
+        <key>commonweath</key>
+        <string>commonwealth</string>
+        <key>commuications</key>
+        <string>communications</string>
+        <key>commuinications</key>
+        <string>communications</string>
+        <key>communciation</key>
+        <string>communication</string>
+        <key>communiation</key>
+        <string>communication</string>
+        <key>communites</key>
+        <string>communities</string>
+        <key>compability</key>
+        <string>compatibility</string>
+        <key>comparision</key>
+        <string>comparison</string>
+        <key>comparisions</key>
+        <string>comparisons</string>
+        <key>comparitive</key>
+        <string>comparative</string>
+        <key>comparitively</key>
+        <string>comparatively</string>
+        <key>compatabilities</key>
+        <string>compatibilities</string>
+        <key>compatability</key>
+        <string>compatibility</string>
+        <key>compatable</key>
+        <string>compatible</string>
+        <key>compatablities</key>
+        <string>compatibilities</string>
+        <key>compatablity</key>
+        <string>compatibility</string>
+        <key>compatiable</key>
+        <string>compatible</string>
+        <key>compatiblities</key>
+        <string>compatibilities</string>
+        <key>compatiblity</key>
+        <string>compatibility</string>
+        <key>compeitions</key>
+        <string>competitions</string>
+        <key>compensantion</key>
+        <string>compensation</string>
+        <key>competance</key>
+        <string>competence</string>
+        <key>competant</key>
+        <string>competent</string>
+        <key>competative</key>
+        <string>competitive</string>
+        <key>competion</key>
+        <string>competition</string>
+        <key>competitiion</key>
+        <string>competition</string>
+        <key>competive</key>
+        <string>competitive</string>
+        <key>competiveness</key>
+        <string>competitiveness</string>
+        <key>comphrehensive</key>
+        <string>comprehensive</string>
+        <key>compitent</key>
+        <string>competent</string>
+        <key>completedthe</key>
+        <string>completed the</string>
+        <key>completelyl</key>
+        <string>completely</string>
+        <key>completetion</key>
+        <string>completion</string>
+        <key>complier</key>
+        <string>compiler</string>
+        <key>componant</key>
+        <string>component</string>
+        <key>comprable</key>
+        <string>comparable</string>
+        <key>comprimise</key>
+        <string>compromise</string>
+        <key>compulsary</key>
+        <string>compulsory</string>
+        <key>compulsery</key>
+        <string>compulsory</string>
+        <key>computarized</key>
+        <string>computerized</string>
+        <key>concensus</key>
+        <string>consensus</string>
+        <key>concider</key>
+        <string>consider</string>
+        <key>concidered</key>
+        <string>considered</string>
+        <key>concidering</key>
+        <string>considering</string>
+        <key>conciders</key>
+        <string>considers</string>
+        <key>concieted</key>
+        <string>conceited</string>
+        <key>concieved</key>
+        <string>conceived</string>
+        <key>concious</key>
+        <string>conscious</string>
+        <key>conciously</key>
+        <string>consciously</string>
+        <key>conciousness</key>
+        <string>consciousness</string>
+        <key>condamned</key>
+        <string>condemned</string>
+        <key>condemmed</key>
+        <string>condemned</string>
+        <key>condidtion</key>
+        <string>condition</string>
+        <key>condidtions</key>
+        <string>conditions</string>
+        <key>conditionsof</key>
+        <string>conditions of</string>
+        <key>conected</key>
+        <string>connected</string>
+        <key>conection</key>
+        <string>connection</string>
+        <key>conesencus</key>
+        <string>consensus</string>
+        <key>confidental</key>
+        <string>confidential</string>
+        <key>confidentally</key>
+        <string>confidentially</string>
+        <key>confids</key>
+        <string>confides</string>
+        <key>configureable</key>
+        <string>configurable</string>
+        <key>confortable</key>
+        <string>comfortable</string>
+        <key>congradulations</key>
+        <string>congratulations</string>
+        <key>congresional</key>
+        <string>congressional</string>
+        <key>conived</key>
+        <string>connived</string>
+        <key>conjecutre</key>
+        <string>conjecture</string>
+        <key>conjuction</key>
+        <string>conjunction</string>
+        <key>conotations</key>
+        <string>connotations</string>
+        <key>conquerd</key>
+        <string>conquered</string>
+        <key>conquerer</key>
+        <string>conqueror</string>
+        <key>conquerers</key>
+        <string>conquerors</string>
+        <key>conqured</key>
+        <string>conquered</string>
+        <key>conscent</key>
+        <string>consent</string>
+        <key>consciouness</key>
+        <string>consciousness</string>
+        <key>consdider</key>
+        <string>consider</string>
+        <key>consdidered</key>
+        <string>considered</string>
+        <key>consdiered</key>
+        <string>considered</string>
+        <key>consectutive</key>
+        <string>consecutive</string>
+        <key>consenquently</key>
+        <string>consequently</string>
+        <key>consentrate</key>
+        <string>concentrate</string>
+        <key>consentrated</key>
+        <string>concentrated</string>
+        <key>consentrates</key>
+        <string>concentrates</string>
+        <key>consept</key>
+        <string>concept</string>
+        <key>consequentually</key>
+        <string>consequently</string>
+        <key>consequeseces</key>
+        <string>consequences</string>
+        <key>consern</key>
+        <string>concern</string>
+        <key>conserned</key>
+        <string>concerned</string>
+        <key>conserning</key>
+        <string>concerning</string>
+        <key>conservitive</key>
+        <string>conservative</string>
+        <key>consiciousness</key>
+        <string>consciousness</string>
+        <key>consicousness</key>
+        <string>consciousness</string>
+        <key>considerd</key>
+        <string>considered</string>
+        <key>consideres</key>
+        <string>considered</string>
+        <key>consious</key>
+        <string>conscious</string>
+        <key>consistant</key>
+        <string>consistent</string>
+        <key>consistantly</key>
+        <string>consistently</string>
+        <key>consituencies</key>
+        <string>constituencies</string>
+        <key>consituency</key>
+        <string>constituency</string>
+        <key>consituted</key>
+        <string>constituted</string>
+        <key>consitution</key>
+        <string>constitution</string>
+        <key>consitutional</key>
+        <string>constitutional</string>
+        <key>consolodate</key>
+        <string>consolidate</string>
+        <key>consolodated</key>
+        <string>consolidated</string>
+        <key>consonent</key>
+        <string>consonant</string>
+        <key>consonents</key>
+        <string>consonants</string>
+        <key>consorcium</key>
+        <string>consortium</string>
+        <key>conspiracys</key>
+        <string>conspiracies</string>
+        <key>conspiriator</key>
+        <string>conspirator</string>
+        <key>constaints</key>
+        <string>constraints</string>
+        <key>constanly</key>
+        <string>constantly</string>
+        <key>constarnation</key>
+        <string>consternation</string>
+        <key>constatn</key>
+        <string>constant</string>
+        <key>constinually</key>
+        <string>continually</string>
+        <key>constituant</key>
+        <string>constituent</string>
+        <key>constituants</key>
+        <string>constituents</string>
+        <key>constituion</key>
+        <string>constitution</string>
+        <key>constituional</key>
+        <string>constitutional</string>
+        <key>consttruction</key>
+        <string>construction</string>
+        <key>constuction</key>
+        <string>construction</string>
+        <key>consulant</key>
+        <string>consultant</string>
+        <key>consumate</key>
+        <string>consummate</string>
+        <key>consumated</key>
+        <string>consummated</string>
+        <key>contaiminate</key>
+        <string>contaminate</string>
+        <key>containes</key>
+        <string>contains</string>
+        <key>contamporaries</key>
+        <string>contemporaries</string>
+        <key>contamporary</key>
+        <string>contemporary</string>
+        <key>contempoary</key>
+        <string>contemporary</string>
+        <key>contemporaneus</key>
+        <string>contemporaneous</string>
+        <key>contempory</key>
+        <string>contemporary</string>
+        <key>contendor</key>
+        <string>contender</string>
+        <key>contibute</key>
+        <string>contribute </string>
+        <key>contibuted</key>
+        <string>contributed </string>
+        <key>contibutes</key>
+        <string>contributes </string>
+        <key>contigent</key>
+        <string>contingent</string>
+        <key>contined</key>
+        <string>continued</string>
+        <key>continous</key>
+        <string>continuous</string>
+        <key>continously</key>
+        <string>continuously</string>
+        <key>continueing</key>
+        <string>continuing</string>
+        <key>contravercial</key>
+        <string>controversial</string>
+        <key>contraversy</key>
+        <string>controversy</string>
+        <key>contributer</key>
+        <string>contributor</string>
+        <key>contributers</key>
+        <string>contributors</string>
+        <key>contritutions</key>
+        <string>contributions</string>
+        <key>controled</key>
+        <string>controlled</string>
+        <key>controling</key>
+        <string>controlling</string>
+        <key>controll</key>
+        <string>control</string>
+        <key>controlls</key>
+        <string>controls</string>
+        <key>controvercial</key>
+        <string>controversial</string>
+        <key>controvercy</key>
+        <string>controversy</string>
+        <key>controveries</key>
+        <string>controversies</string>
+        <key>controversal</key>
+        <string>controversial</string>
+        <key>controversey</key>
+        <string>controversy</string>
+        <key>controvertial</key>
+        <string>controversial</string>
+        <key>controvery</key>
+        <string>controversy</string>
+        <key>contruction</key>
+        <string>construction</string>
+        <key>conveinent</key>
+        <string>convenient</string>
+        <key>convenant</key>
+        <string>covenant</string>
+        <key>convential</key>
+        <string>conventional</string>
+        <key>convertables</key>
+        <string>convertibles</string>
+        <key>convertion</key>
+        <string>conversion</string>
+        <key>conveyer</key>
+        <string>conveyor</string>
+        <key>conviced</key>
+        <string>convinced</string>
+        <key>convienient</key>
+        <string>convenient</string>
+        <key>coordiantion</key>
+        <string>coordination</string>
+        <key>coorperations</key>
+        <string>corporations</string>
+        <key>copmetitors</key>
+        <string>competitors</string>
+        <key>coputer</key>
+        <string>computer</string>
+        <key>copywrite</key>
+        <string>copyright</string>
+        <key>coridal</key>
+        <string>cordial</string>
+        <key>cornmitted</key>
+        <string>committed</string>
+        <key>corosion</key>
+        <string>corrosion</string>
+        <key>corparate</key>
+        <string>corporate</string>
+        <key>corperations</key>
+        <string>corporations</string>
+        <key>correcters</key>
+        <string>correctors</string>
+        <key>correponding</key>
+        <string>corresponding</string>
+        <key>correposding</key>
+        <string>corresponding</string>
+        <key>correspondant</key>
+        <string>correspondent</string>
+        <key>correspondants</key>
+        <string>correspondents</string>
+        <key>corridoors</key>
+        <string>corridors</string>
+        <key>corrispond</key>
+        <string>correspond</string>
+        <key>corrispondant</key>
+        <string>correspondent</string>
+        <key>corrispondants</key>
+        <string>correspondents</string>
+        <key>corrisponded</key>
+        <string>corresponded</string>
+        <key>corrisponding</key>
+        <string>corresponding</string>
+        <key>corrisponds</key>
+        <string>corresponds</string>
+        <key>costitution</key>
+        <string>constitution</string>
+        <key>coucil</key>
+        <string>council</string>
+        <key>counries</key>
+        <string>countries</string>
+        <key>countains</key>
+        <string>contains</string>
+        <key>countires</key>
+        <string>countries</string>
+        <key>coururier</key>
+        <string>courier</string>
+        <key>coverted</key>
+        <string>converted</string>
+        <key>cpoy</key>
+        <string>copy</string>
+        <key>creaeted</key>
+        <string>created</string>
+        <key>creedence</key>
+        <string>credence</string>
+        <key>critereon</key>
+        <string>criterion</string>
+        <key>criterias</key>
+        <string>criteria</string>
+        <key>criticists</key>
+        <string>critics</string>
+        <key>critising</key>
+        <string>criticising</string>
+        <key>critisising</key>
+        <string>criticising</string>
+        <key>critisism</key>
+        <string>criticism</string>
+        <key>critisisms</key>
+        <string>criticisms</string>
+        <key>critisize</key>
+        <string>criticise</string>
+        <key>critisized</key>
+        <string>criticised</string>
+        <key>critisizes</key>
+        <string>criticises</string>
+        <key>critisizing</key>
+        <string>criticising</string>
+        <key>critized</key>
+        <string>criticized</string>
+        <key>critizing</key>
+        <string>criticizing</string>
+        <key>crockodiles</key>
+        <string>crocodiles</string>
+        <key>crowm</key>
+        <string>crown</string>
+        <key>crtical</key>
+        <string>critical</string>
+        <key>crticised</key>
+        <string>criticised</string>
+        <key>crucifiction</key>
+        <string>crucifixion</string>
+        <key>crusies</key>
+        <string>cruises</string>
+        <key>crystalisation</key>
+        <string>crystallisation</string>
+        <key>culiminating</key>
+        <string>culminating</string>
+        <key>cumulatative</key>
+        <string>cumulative</string>
+        <key>curch</key>
+        <string>church</string>
+        <key>curcuit</key>
+        <string>circuit</string>
+        <key>currenly</key>
+        <string>currently</string>
+        <key>curriculem</key>
+        <string>curriculum</string>
+        <key>cxan</key>
+        <string>cyan</string>
+        <key>cyclinder</key>
+        <string>cylinder</string>
+        <key>dacquiri</key>
+        <string>daiquiri</string>
+        <key>dael</key>
+        <string>deal</string>
+        <key>dalmation</key>
+        <string>dalmatian</string>
+        <key>damenor</key>
+        <string>demeanor</string>
+        <key>dammage</key>
+        <string>damage</string>
+        <key>daugher</key>
+        <string>daughter</string>
+        <key>debateable</key>
+        <string>debatable</string>
+        <key>decendant</key>
+        <string>descendant</string>
+        <key>decendants</key>
+        <string>descendants</string>
+        <key>decendent</key>
+        <string>descendant</string>
+        <key>decendents</key>
+        <string>descendants</string>
+        <key>decideable</key>
+        <string>decidable</string>
+        <key>decidely</key>
+        <string>decidedly</string>
+        <key>decieved</key>
+        <string>deceived</string>
+        <key>decison</key>
+        <string>decision</string>
+        <key>decomissioned</key>
+        <string>decommissioned</string>
+        <key>decomposit</key>
+        <string>decompose</string>
+        <key>decomposited</key>
+        <string>decomposed</string>
+        <key>decompositing</key>
+        <string>decomposing</string>
+        <key>decomposits</key>
+        <string>decomposes</string>
+        <key>decress</key>
+        <string>decrees</string>
+        <key>decribe</key>
+        <string>describe</string>
+        <key>decribed</key>
+        <string>described</string>
+        <key>decribes</key>
+        <string>describes</string>
+        <key>decribing</key>
+        <string>describing</string>
+        <key>dectect</key>
+        <string>detect</string>
+        <key>defendent</key>
+        <string>defendant</string>
+        <key>defendents</key>
+        <string>defendants</string>
+        <key>deffensively</key>
+        <string>defensively</string>
+        <key>deffine</key>
+        <string>define</string>
+        <key>deffined</key>
+        <string>defined</string>
+        <key>definance</key>
+        <string>defiance</string>
+        <key>definate</key>
+        <string>definite</string>
+        <key>definately</key>
+        <string>definitely</string>
+        <key>definatly</key>
+        <string>definitely</string>
+        <key>definetly</key>
+        <string>definitely</string>
+        <key>definining</key>
+        <string>defining</string>
+        <key>definit</key>
+        <string>definite</string>
+        <key>definitly</key>
+        <string>definitely</string>
+        <key>definiton</key>
+        <string>definition</string>
+        <key>defintion</key>
+        <string>definition</string>
+        <key>degrate</key>
+        <string>degrade</string>
+        <key>delagates</key>
+        <string>delegates</string>
+        <key>delapidated</key>
+        <string>dilapidated</string>
+        <key>delerious</key>
+        <string>delirious</string>
+        <key>delevopment</key>
+        <string>development</string>
+        <key>deliberatly</key>
+        <string>deliberately</string>
+        <key>delusionally</key>
+        <string>delusively</string>
+        <key>demenor</key>
+        <string>demeanor</string>
+        <key>demographical</key>
+        <string>demographic</string>
+        <key>demolision</key>
+        <string>demolition</string>
+        <key>demorcracy</key>
+        <string>democracy</string>
+        <key>demostration</key>
+        <string>demonstration</string>
+        <key>denegrating</key>
+        <string>denigrating</string>
+        <key>densly</key>
+        <string>densely</string>
+        <key>deparment</key>
+        <string>department</string>
+        <key>deparmental</key>
+        <string>departmental</string>
+        <key>deparments</key>
+        <string>departments</string>
+        <key>dependance</key>
+        <string>dependence</string>
+        <key>dependancy</key>
+        <string>dependency</string>
+        <key>dependant</key>
+        <string>dependent</string>
+        <key>deram</key>
+        <string>dream</string>
+        <key>deriviated</key>
+        <string>derived</string>
+        <key>derivitive</key>
+        <string>derivative</string>
+        <key>derogitory</key>
+        <string>derogatory</string>
+        <key>descendands</key>
+        <string>descendants</string>
+        <key>descibed</key>
+        <string>described</string>
+        <key>descision</key>
+        <string>decision</string>
+        <key>descisions</key>
+        <string>decisions</string>
+        <key>descriibes</key>
+        <string>describes</string>
+        <key>descripters</key>
+        <string>descriptors</string>
+        <key>descripton</key>
+        <string>description</string>
+        <key>desctruction</key>
+        <string>destruction</string>
+        <key>descuss</key>
+        <string>discuss</string>
+        <key>desgined</key>
+        <string>designed</string>
+        <key>deside</key>
+        <string>decide</string>
+        <key>desigining</key>
+        <string>designing</string>
+        <key>desinations</key>
+        <string>destinations</string>
+        <key>desintegrated</key>
+        <string>disintegrated</string>
+        <key>desintegration</key>
+        <string>disintegration</string>
+        <key>desireable</key>
+        <string>desirable</string>
+        <key>desitned</key>
+        <string>destined</string>
+        <key>desktiop</key>
+        <string>desktop</string>
+        <key>desorder</key>
+        <string>disorder</string>
+        <key>desoriented</key>
+        <string>disoriented</string>
+        <key>desparate</key>
+        <string>desperate</string>
+        <key>despict</key>
+        <string>depict</string>
+        <key>despiration</key>
+        <string>desperation</string>
+        <key>dessicated</key>
+        <string>desiccated</string>
+        <key>dessigned</key>
+        <string>designed</string>
+        <key>destablized</key>
+        <string>destabilized</string>
+        <key>destory</key>
+        <string>destroy</string>
+        <key>detailled</key>
+        <string>detailed</string>
+        <key>detatched</key>
+        <string>detached</string>
+        <key>deteoriated</key>
+        <string>deteriorated</string>
+        <key>deteriate</key>
+        <string>deteriorate</string>
+        <key>deterioriating</key>
+        <string>deteriorating</string>
+        <key>determinining</key>
+        <string>determining</string>
+        <key>detremental</key>
+        <string>detrimental</string>
+        <key>devasted</key>
+        <string>devastated</string>
+        <key>develope</key>
+        <string>develop</string>
+        <key>developement</key>
+        <string>development</string>
+        <key>developped</key>
+        <string>developed</string>
+        <key>develpment</key>
+        <string>development</string>
+        <key>devels</key>
+        <string>delves</string>
+        <key>devestated</key>
+        <string>devastated</string>
+        <key>devestating</key>
+        <string>devastating</string>
+        <key>devide</key>
+        <string>divide</string>
+        <key>devided</key>
+        <string>divided</string>
+        <key>devistating</key>
+        <string>devastating</string>
+        <key>devolopement</key>
+        <string>development</string>
+        <key>diablical</key>
+        <string>diabolical</string>
+        <key>diamons</key>
+        <string>diamonds</string>
+        <key>diaster</key>
+        <string>disaster</string>
+        <key>dichtomy</key>
+        <string>dichotomy</string>
+        <key>diconnects</key>
+        <string>disconnects</string>
+        <key>dicover</key>
+        <string>discover</string>
+        <key>dicovered</key>
+        <string>discovered</string>
+        <key>dicovering</key>
+        <string>discovering</string>
+        <key>dicovers</key>
+        <string>discovers</string>
+        <key>dicovery</key>
+        <string>discovery</string>
+        <key>dicussed</key>
+        <string>discussed</string>
+        <key>didnt</key>
+        <string>didn&apos;t</string>
+        <key>diea</key>
+        <string>idea</string>
+        <key>dieing</key>
+        <string>dying</string>
+        <key>dieties</key>
+        <string>deities</string>
+        <key>diety</key>
+        <string>deity</string>
+        <key>diferent</key>
+        <string>different</string>
+        <key>diferrent</key>
+        <string>different</string>
+        <key>differentiatiations</key>
+        <string>differentiations</string>
+        <key>differnt</key>
+        <string>different</string>
+        <key>difficulity</key>
+        <string>difficulty</string>
+        <key>diffrent</key>
+        <string>different</string>
+        <key>dificulties</key>
+        <string>difficulties</string>
+        <key>dificulty</key>
+        <string>difficulty</string>
+        <key>dimenions</key>
+        <string>dimensions</string>
+        <key>dimention</key>
+        <string>dimension</string>
+        <key>dimentional</key>
+        <string>dimensional</string>
+        <key>dimentions</key>
+        <string>dimensions</string>
+        <key>dimesnional</key>
+        <string>dimensional</string>
+        <key>diminuitive</key>
+        <string>diminutive</string>
+        <key>dimunitive</key>
+        <string>diminutive</string>
+        <key>diosese</key>
+        <string>diocese</string>
+        <key>diphtong</key>
+        <string>diphthong</string>
+        <key>diphtongs</key>
+        <string>diphthongs</string>
+        <key>diplomancy</key>
+        <string>diplomacy</string>
+        <key>dipthong</key>
+        <string>diphthong</string>
+        <key>dipthongs</key>
+        <string>diphthongs</string>
+        <key>dirived</key>
+        <string>derived</string>
+        <key>disagreeed</key>
+        <string>disagreed</string>
+        <key>disapeared</key>
+        <string>disappeared</string>
+        <key>disapointing</key>
+        <string>disappointing</string>
+        <key>disappearred</key>
+        <string>disappeared</string>
+        <key>disaproval</key>
+        <string>disapproval</string>
+        <key>disasterous</key>
+        <string>disastrous</string>
+        <key>disatisfaction</key>
+        <string>dissatisfaction</string>
+        <key>disatisfied</key>
+        <string>dissatisfied</string>
+        <key>disatrous</key>
+        <string>disastrous</string>
+        <key>discontentment</key>
+        <string>discontent</string>
+        <key>discribe</key>
+        <string>describe</string>
+        <key>discribed</key>
+        <string>described</string>
+        <key>discribes</key>
+        <string>describes</string>
+        <key>discribing</key>
+        <string>describing</string>
+        <key>disctinction</key>
+        <string>distinction</string>
+        <key>disctinctive</key>
+        <string>distinctive</string>
+        <key>disemination</key>
+        <string>dissemination</string>
+        <key>disenchanged</key>
+        <string>disenchanted</string>
+        <key>disiplined</key>
+        <string>disciplined</string>
+        <key>disobediance</key>
+        <string>disobedience</string>
+        <key>disobediant</key>
+        <string>disobedient</string>
+        <key>disolved</key>
+        <string>dissolved</string>
+        <key>disover</key>
+        <string>discover</string>
+        <key>dispair</key>
+        <string>despair</string>
+        <key>disparingly</key>
+        <string>disparagingly</string>
+        <key>dispence</key>
+        <string>dispense</string>
+        <key>dispenced</key>
+        <string>dispensed</string>
+        <key>dispencing</key>
+        <string>dispensing</string>
+        <key>dispicable</key>
+        <string>despicable</string>
+        <key>dispite</key>
+        <string>despite</string>
+        <key>dispostion</key>
+        <string>disposition</string>
+        <key>disproportiate</key>
+        <string>disproportionate</string>
+        <key>disputandem</key>
+        <string>disputandum</string>
+        <key>disricts</key>
+        <string>districts</string>
+        <key>dissagreement</key>
+        <string>disagreement</string>
+        <key>dissapear</key>
+        <string>disappear</string>
+        <key>dissapearance</key>
+        <string>disappearance</string>
+        <key>dissapeared</key>
+        <string>disappeared</string>
+        <key>dissapearing</key>
+        <string>disappearing</string>
+        <key>dissapears</key>
+        <string>disappears</string>
+        <key>dissappear</key>
+        <string>disappear</string>
+        <key>dissappears</key>
+        <string>disappears</string>
+        <key>dissappointed</key>
+        <string>disappointed</string>
+        <key>dissarray</key>
+        <string>disarray</string>
+        <key>dissobediance</key>
+        <string>disobedience</string>
+        <key>dissobediant</key>
+        <string>disobedient</string>
+        <key>dissobedience</key>
+        <string>disobedience</string>
+        <key>dissobedient</key>
+        <string>disobedient</string>
+        <key>distiction</key>
+        <string>distinction</string>
+        <key>distingish</key>
+        <string>distinguish</string>
+        <key>distingished</key>
+        <string>distinguished</string>
+        <key>distingishes</key>
+        <string>distinguishes</string>
+        <key>distingishing</key>
+        <string>distinguishing</string>
+        <key>distingquished</key>
+        <string>distinguished</string>
+        <key>distrubution</key>
+        <string>distribution</string>
+        <key>distruction</key>
+        <string>destruction</string>
+        <key>distructive</key>
+        <string>destructive</string>
+        <key>ditributed</key>
+        <string>distributed</string>
+        <key>diversed</key>
+        <string>diverged</string>
+        <key>divice</key>
+        <string>device</string>
+        <key>divison</key>
+        <string>division</string>
+        <key>divisons</key>
+        <string>divisions</string>
+        <key>doccument</key>
+        <string>document</string>
+        <key>doccumented</key>
+        <string>documented</string>
+        <key>doccuments</key>
+        <string>documents</string>
+        <key>docrines</key>
+        <string>doctrines</string>
+        <key>doctines</key>
+        <string>doctrines</string>
+        <key>documenatry</key>
+        <string>documentary</string>
+        <key>doens</key>
+        <string>does</string>
+        <key>doesnt</key>
+        <string>doesn&apos;t</string>
+        <key>doign</key>
+        <string>doing</string>
+        <key>dominaton</key>
+        <string>domination</string>
+        <key>dominent</key>
+        <string>dominant</string>
+        <key>dominiant</key>
+        <string>dominant</string>
+        <key>donig</key>
+        <string>doing</string>
+        <key>dont</key>
+        <string>don&apos;t</string>
+        <key>dosen&apos;t</key>
+        <string>doesn&apos;t</string>
+        <key>doub</key>
+        <string>doubt</string>
+        <key>doulbe</key>
+        <string>double</string>
+        <key>dowloads</key>
+        <string>downloads</string>
+        <key>dramtic</key>
+        <string>dramatic</string>
+        <key>draughtman</key>
+        <string>draughtsman</string>
+        <key>dreasm</key>
+        <string>dreams</string>
+        <key>driectly</key>
+        <string>directly</string>
+        <key>drnik</key>
+        <string>drink</string>
+        <key>druming</key>
+        <string>drumming</string>
+        <key>drummless</key>
+        <string>drumless</string>
+        <key>dupicate</key>
+        <string>duplicate</string>
+        <key>durig</key>
+        <string>during</string>
+        <key>durring</key>
+        <string>during</string>
+        <key>duting</key>
+        <string>during</string>
+        <key>dyas</key>
+        <string>dryas</string>
+        <key>eahc</key>
+        <string>each</string>
+        <key>ealier</key>
+        <string>earlier</string>
+        <key>earlies</key>
+        <string>earliest</string>
+        <key>earnt</key>
+        <string>earned</string>
+        <key>ecclectic</key>
+        <string>eclectic</string>
+        <key>eceonomy</key>
+        <string>economy</string>
+        <key>ecidious</key>
+        <string>deciduous</string>
+        <key>eclispe</key>
+        <string>eclipse</string>
+        <key>ecomonic</key>
+        <string>economic</string>
+        <key>ect</key>
+        <string>etc</string>
+        <key>eearly</key>
+        <string>early</string>
+        <key>efel</key>
+        <string>evil</string>
+        <key>effeciency</key>
+        <string>efficiency</string>
+        <key>effecient</key>
+        <string>efficient</string>
+        <key>effeciently</key>
+        <string>efficiently</string>
+        <key>efficency</key>
+        <string>efficiency</string>
+        <key>efficent</key>
+        <string>efficient</string>
+        <key>efficently</key>
+        <string>efficiently</string>
+        <key>efford</key>
+        <string>effort</string>
+        <key>effords</key>
+        <string>efforts</string>
+        <key>effulence</key>
+        <string>effluence</string>
+        <key>eigth</key>
+        <string>eight</string>
+        <key>eiter</key>
+        <string>either</string>
+        <key>elction</key>
+        <string>election</string>
+        <key>electic</key>
+        <string>electric</string>
+        <key>electon</key>
+        <string>electron</string>
+        <key>electrial</key>
+        <string>electrical</string>
+        <key>electricly</key>
+        <string>electrically</string>
+        <key>electricty</key>
+        <string>electricity</string>
+        <key>elementay</key>
+        <string>elementary</string>
+        <key>eleminated</key>
+        <string>eliminated</string>
+        <key>eleminating</key>
+        <string>eliminating</string>
+        <key>eles</key>
+        <string>eels</string>
+        <key>eletricity</key>
+        <string>electricity</string>
+        <key>elicided</key>
+        <string>elicited</string>
+        <key>eligable</key>
+        <string>eligible</string>
+        <key>elimentary</key>
+        <string>elementary</string>
+        <key>ellected</key>
+        <string>elected</string>
+        <key>elphant</key>
+        <string>elephant</string>
+        <key>embarass</key>
+        <string>embarrass</string>
+        <key>embarassed</key>
+        <string>embarrassed</string>
+        <key>embarassing</key>
+        <string>embarrassing</string>
+        <key>embarassment</key>
+        <string>embarrassment</string>
+        <key>embargos</key>
+        <string>embargoes</string>
+        <key>embarras</key>
+        <string>embarrass</string>
+        <key>embarrased</key>
+        <string>embarrassed</string>
+        <key>embarrasing</key>
+        <string>embarrassing</string>
+        <key>embarrasment</key>
+        <string>embarrassment</string>
+        <key>embezelled</key>
+        <string>embezzled</string>
+        <key>emblamatic</key>
+        <string>emblematic</string>
+        <key>eminate</key>
+        <string>emanate</string>
+        <key>eminated</key>
+        <string>emanated</string>
+        <key>emision</key>
+        <string>emission</string>
+        <key>emited</key>
+        <string>emitted</string>
+        <key>emiting</key>
+        <string>emitting</string>
+        <key>emition</key>
+        <string>emission</string>
+        <key>emmediately</key>
+        <string>immediately</string>
+        <key>emmigrated</key>
+        <string>immigrated</string>
+        <key>emminently</key>
+        <string>eminently</string>
+        <key>emmisaries</key>
+        <string>emissaries</string>
+        <key>emmisarries</key>
+        <string>emissaries</string>
+        <key>emmisarry</key>
+        <string>emissary</string>
+        <key>emmisary</key>
+        <string>emissary</string>
+        <key>emmision</key>
+        <string>emission</string>
+        <key>emmisions</key>
+        <string>emissions</string>
+        <key>emmited</key>
+        <string>emitted</string>
+        <key>emmiting</key>
+        <string>emitting</string>
+        <key>emmitted</key>
+        <string>emitted</string>
+        <key>emmitting</key>
+        <string>emitting</string>
+        <key>emnity</key>
+        <string>enmity</string>
+        <key>emperical</key>
+        <string>empirical</string>
+        <key>emphaised</key>
+        <string>emphasised</string>
+        <key>emphsis</key>
+        <string>emphasis</string>
+        <key>emphysyma</key>
+        <string>emphysema</string>
+        <key>emprisoned</key>
+        <string>imprisoned</string>
+        <key>enameld</key>
+        <string>enameled</string>
+        <key>enchancement</key>
+        <string>enhancement</string>
+        <key>encouraing</key>
+        <string>encouraging</string>
+        <key>encryptiion</key>
+        <string>encryption</string>
+        <key>encylopedia</key>
+        <string>encyclopedia</string>
+        <key>endevors</key>
+        <string>endeavors</string>
+        <key>endevour</key>
+        <string>endeavour</string>
+        <key>endig</key>
+        <string>ending</string>
+        <key>endolithes</key>
+        <string>endoliths</string>
+        <key>enduce</key>
+        <string>induce</string>
+        <key>ened</key>
+        <string>need</string>
+        <key>enflamed</key>
+        <string>inflamed</string>
+        <key>enforceing</key>
+        <string>enforcing</string>
+        <key>engagment</key>
+        <string>engagement</string>
+        <key>engeneer</key>
+        <string>engineer</string>
+        <key>engeneering</key>
+        <string>engineering</string>
+        <key>engieneer</key>
+        <string>engineer</string>
+        <key>engieneers</key>
+        <string>engineers</string>
+        <key>enlargment</key>
+        <string>enlargement</string>
+        <key>enlargments</key>
+        <string>enlargements</string>
+        <key>enourmous</key>
+        <string>enormous</string>
+        <key>enourmously</key>
+        <string>enormously</string>
+        <key>ensconsed</key>
+        <string>ensconced</string>
+        <key>entaglements</key>
+        <string>entanglements</string>
+        <key>enteratinment</key>
+        <string>entertainment</string>
+        <key>enthusiatic</key>
+        <string>enthusiastic</string>
+        <key>entitity</key>
+        <string>entity</string>
+        <key>entitlied</key>
+        <string>entitled</string>
+        <key>entrepeneur</key>
+        <string>entrepreneur</string>
+        <key>entrepeneurs</key>
+        <string>entrepreneurs</string>
+        <key>enviorment</key>
+        <string>environment</string>
+        <key>enviormental</key>
+        <string>environmental</string>
+        <key>enviormentally</key>
+        <string>environmentally</string>
+        <key>enviorments</key>
+        <string>environments</string>
+        <key>enviornment</key>
+        <string>environment</string>
+        <key>enviornmental</key>
+        <string>environmental</string>
+        <key>enviornmentalist</key>
+        <string>environmentalist</string>
+        <key>enviornmentally</key>
+        <string>environmentally</string>
+        <key>enviornments</key>
+        <string>environments</string>
+        <key>enviroment</key>
+        <string>environment</string>
+        <key>enviromental</key>
+        <string>environmental</string>
+        <key>enviromentalist</key>
+        <string>environmentalist</string>
+        <key>enviromentally</key>
+        <string>environmentally</string>
+        <key>enviroments</key>
+        <string>environments</string>
+        <key>envolutionary</key>
+        <string>evolutionary</string>
+        <key>envrionments</key>
+        <string>environments</string>
+        <key>enxt</key>
+        <string>next</string>
+        <key>epidsodes</key>
+        <string>episodes</string>
+        <key>epsiode</key>
+        <string>episode</string>
+        <key>equialent</key>
+        <string>equivalent</string>
+        <key>equilibium</key>
+        <string>equilibrium</string>
+        <key>equilibrum</key>
+        <string>equilibrium</string>
+        <key>equiped</key>
+        <string>equipped</string>
+        <key>equippment</key>
+        <string>equipment</string>
+        <key>equitorial</key>
+        <string>equatorial</string>
+        <key>equivelant</key>
+        <string>equivalent</string>
+        <key>equivelent</key>
+        <string>equivalent</string>
+        <key>equivilant</key>
+        <string>equivalent</string>
+        <key>equivilent</key>
+        <string>equivalent</string>
+        <key>equivlalent</key>
+        <string>equivalent</string>
+        <key>erally</key>
+        <string>really</string>
+        <key>eratic</key>
+        <string>erratic</string>
+        <key>eratically</key>
+        <string>erratically</string>
+        <key>eraticly</key>
+        <string>erratically</string>
+        <key>errupted</key>
+        <string>erupted</string>
+        <key>esential</key>
+        <string>essential</string>
+        <key>esitmated</key>
+        <string>estimated</string>
+        <key>esle</key>
+        <string>else</string>
+        <key>especialy</key>
+        <string>especially</string>
+        <key>essencial</key>
+        <string>essential</string>
+        <key>essense</key>
+        <string>essence</string>
+        <key>essentail</key>
+        <string>essential</string>
+        <key>essentialy</key>
+        <string>essentially</string>
+        <key>essentual</key>
+        <string>essential</string>
+        <key>essesital</key>
+        <string>essential</string>
+        <key>estabishes</key>
+        <string>establishes</string>
+        <key>establising</key>
+        <string>establishing</string>
+        <key>ethnocentricm</key>
+        <string>ethnocentrism</string>
+        <key>ethose</key>
+        <string>those</string>
+        <key>evenhtually</key>
+        <string>eventually</string>
+        <key>eventally</key>
+        <string>eventually</string>
+        <key>eventhough</key>
+        <string>even though</string>
+        <key>eventially</key>
+        <string>eventually</string>
+        <key>eventualy</key>
+        <string>eventually</string>
+        <key>everthing</key>
+        <string>everything</string>
+        <key>everytime</key>
+        <string>every time</string>
+        <key>everyting</key>
+        <string>everything</string>
+        <key>eveyr</key>
+        <string>every</string>
+        <key>evidentally</key>
+        <string>evidently</string>
+        <key>exagerate</key>
+        <string>exaggerate</string>
+        <key>exagerated</key>
+        <string>exaggerated</string>
+        <key>exagerates</key>
+        <string>exaggerates</string>
+        <key>exagerating</key>
+        <string>exaggerating</string>
+        <key>exagerrate</key>
+        <string>exaggerate</string>
+        <key>exagerrated</key>
+        <string>exaggerated</string>
+        <key>exagerrates</key>
+        <string>exaggerates</string>
+        <key>exagerrating</key>
+        <string>exaggerating</string>
+        <key>examinated</key>
+        <string>examined</string>
+        <key>exampt</key>
+        <string>exempt</string>
+        <key>exapansion</key>
+        <string>expansion</string>
+        <key>excact</key>
+        <string>exact</string>
+        <key>excange</key>
+        <string>exchange</string>
+        <key>excecute</key>
+        <string>execute</string>
+        <key>excecuted</key>
+        <string>executed</string>
+        <key>excecutes</key>
+        <string>executes</string>
+        <key>excecuting</key>
+        <string>executing</string>
+        <key>excecution</key>
+        <string>execution</string>
+        <key>excedded</key>
+        <string>exceeded</string>
+        <key>excelent</key>
+        <string>excellent</string>
+        <key>excell</key>
+        <string>excel</string>
+        <key>excellance</key>
+        <string>excellence</string>
+        <key>excellant</key>
+        <string>excellent</string>
+        <key>excells</key>
+        <string>excels</string>
+        <key>excercise</key>
+        <string>exercise</string>
+        <key>exchanching</key>
+        <string>exchanging</string>
+        <key>excisted</key>
+        <string>existed</string>
+        <key>exculsivly</key>
+        <string>exclusively</string>
+        <key>execising</key>
+        <string>exercising</string>
+        <key>exection</key>
+        <string>execution</string>
+        <key>exectued</key>
+        <string>executed</string>
+        <key>exeedingly</key>
+        <string>exceedingly</string>
+        <key>exelent</key>
+        <string>excellent</string>
+        <key>exellent</key>
+        <string>excellent</string>
+        <key>exemple</key>
+        <string>example</string>
+        <key>exept</key>
+        <string>except</string>
+        <key>exeptional</key>
+        <string>exceptional</string>
+        <key>exerbate</key>
+        <string>exacerbate</string>
+        <key>exerbated</key>
+        <string>exacerbated</string>
+        <key>exerciese</key>
+        <string>exercises</string>
+        <key>exerpt</key>
+        <string>excerpt</string>
+        <key>exerpts</key>
+        <string>excerpts</string>
+        <key>exersize</key>
+        <string>exercise</string>
+        <key>exerternal</key>
+        <string>external</string>
+        <key>exhalted</key>
+        <string>exalted</string>
+        <key>exhibtion</key>
+        <string>exhibition</string>
+        <key>exibition</key>
+        <string>exhibition</string>
+        <key>exibitions</key>
+        <string>exhibitions</string>
+        <key>exicting</key>
+        <string>exciting</string>
+        <key>exinct</key>
+        <string>extinct</string>
+        <key>existance</key>
+        <string>existence</string>
+        <key>existant</key>
+        <string>existent</string>
+        <key>existince</key>
+        <string>existence</string>
+        <key>exliled</key>
+        <string>exiled</string>
+        <key>exludes</key>
+        <string>excludes</string>
+        <key>exmaple</key>
+        <string>example</string>
+        <key>exonorate</key>
+        <string>exonerate</string>
+        <key>exoskelaton</key>
+        <string>exoskeleton</string>
+        <key>expalin</key>
+        <string>explain</string>
+        <key>expatriot</key>
+        <string>expatriate</string>
+        <key>expeced</key>
+        <string>expected</string>
+        <key>expecially</key>
+        <string>especially</string>
+        <key>expeditonary</key>
+        <string>expeditionary</string>
+        <key>expeiments</key>
+        <string>experiments</string>
+        <key>expell</key>
+        <string>expel</string>
+        <key>expells</key>
+        <string>expels</string>
+        <key>experiance</key>
+        <string>experience</string>
+        <key>experianced</key>
+        <string>experienced</string>
+        <key>expiditions</key>
+        <string>expeditions</string>
+        <key>expierence</key>
+        <string>experience</string>
+        <key>explaination</key>
+        <string>explanation</string>
+        <key>explaning</key>
+        <string>explaining</string>
+        <key>explictly</key>
+        <string>explicitly</string>
+        <key>exploititive</key>
+        <string>exploitative</string>
+        <key>explotation</key>
+        <string>exploitation</string>
+        <key>expropiated</key>
+        <string>expropriated</string>
+        <key>expropiation</key>
+        <string>expropriation</string>
+        <key>exressed</key>
+        <string>expressed</string>
+        <key>extemely</key>
+        <string>extremely</string>
+        <key>extention</key>
+        <string>extension</string>
+        <key>extentions</key>
+        <string>extensions</string>
+        <key>extered</key>
+        <string>exerted</string>
+        <key>extermist</key>
+        <string>extremist</string>
+        <key>extint</key>
+        <string>extinct</string>
+        <key>extradiction</key>
+        <string>extradition</string>
+        <key>extraterrestial</key>
+        <string>extraterrestrial</string>
+        <key>extraterrestials</key>
+        <string>extraterrestrials</string>
+        <key>extravagent</key>
+        <string>extravagant</string>
+        <key>extrememly</key>
+        <string>extremely</string>
+        <key>extremeophile</key>
+        <string>extremophile</string>
+        <key>extremly</key>
+        <string>extremely</string>
+        <key>extrordinarily</key>
+        <string>extraordinarily</string>
+        <key>extrordinary</key>
+        <string>extraordinary</string>
+        <key>eyar</key>
+        <string>year</string>
+        <key>eyars</key>
+        <string>years</string>
+        <key>eyasr</key>
+        <string>years</string>
+        <key>faciliate</key>
+        <string>facilitate</string>
+        <key>faciliated</key>
+        <string>facilitated</string>
+        <key>faciliates</key>
+        <string>facilitates</string>
+        <key>facilites</key>
+        <string>facilities</string>
+        <key>facillitate</key>
+        <string>facilitate</string>
+        <key>facinated</key>
+        <string>fascinated</string>
+        <key>facist</key>
+        <string>fascist</string>
+        <key>familes</key>
+        <string>families</string>
+        <key>familliar</key>
+        <string>familiar</string>
+        <key>famoust</key>
+        <string>famous</string>
+        <key>fanatism</key>
+        <string>fanaticism</string>
+        <key>fatc</key>
+        <string>fact</string>
+        <key>faught</key>
+        <string>fought</string>
+        <key>favoutrable</key>
+        <string>favourable</string>
+        <key>feasable</key>
+        <string>feasible</string>
+        <key>fedreally</key>
+        <string>federally</string>
+        <key>feromone</key>
+        <string>pheromone</string>
+        <key>fertily</key>
+        <string>fertility</string>
+        <key>fianite</key>
+        <string>finite</string>
+        <key>fianlly</key>
+        <string>finally</string>
+        <key>ficticious</key>
+        <string>fictitious</string>
+        <key>fictious</key>
+        <string>fictitious</string>
+        <key>fidn</key>
+        <string>find</string>
+        <key>fiercly</key>
+        <string>fiercely</string>
+        <key>fightings</key>
+        <string>fighting</string>
+        <key>filiament</key>
+        <string>filament</string>
+        <key>fimilies</key>
+        <string>families</string>
+        <key>finacial</key>
+        <string>financial</string>
+        <key>finaly</key>
+        <string>finally</string>
+        <key>financialy</key>
+        <string>financially</string>
+        <key>firends</key>
+        <string>friends</string>
+        <key>firts</key>
+        <string>first</string>
+        <key>fisionable</key>
+        <string>fissionable</string>
+        <key>flamable</key>
+        <string>flammable</string>
+        <key>flawess</key>
+        <string>flawless</string>
+        <key>fleed</key>
+        <string>fled</string>
+        <key>florescent</key>
+        <string>fluorescent</string>
+        <key>flourescent</key>
+        <string>fluorescent</string>
+        <key>flourine</key>
+        <string>fluorine</string>
+        <key>fluorish</key>
+        <string>flourish</string>
+        <key>follwoing</key>
+        <string>following</string>
+        <key>folowing</key>
+        <string>following</string>
+        <key>fomed</key>
+        <string>formed</string>
+        <key>fomr</key>
+        <string>from</string>
+        <key>fonetic</key>
+        <string>phonetic</string>
+        <key>fontrier</key>
+        <string>fontier</string>
+        <key>foootball</key>
+        <string>football</string>
+        <key>forbad</key>
+        <string>forbade</string>
+        <key>forbiden</key>
+        <string>forbidden</string>
+        <key>foreward</key>
+        <string>foreword</string>
+        <key>forfiet</key>
+        <string>forfeit</string>
+        <key>forhead</key>
+        <string>forehead</string>
+        <key>foriegn</key>
+        <string>foreign</string>
+        <key>formallize</key>
+        <string>formalize</string>
+        <key>formallized</key>
+        <string>formalized</string>
+        <key>formaly</key>
+        <string>formally</string>
+        <key>formelly</key>
+        <string>formerly</string>
+        <key>formidible</key>
+        <string>formidable</string>
+        <key>formost</key>
+        <string>foremost</string>
+        <key>forsaw</key>
+        <string>foresaw</string>
+        <key>forseeable</key>
+        <string>foreseeable</string>
+        <key>fortelling</key>
+        <string>foretelling</string>
+        <key>forunner</key>
+        <string>forerunner</string>
+        <key>foucs</key>
+        <string>focus</string>
+        <key>foudn</key>
+        <string>found</string>
+        <key>fougth</key>
+        <string>fought</string>
+        <key>foundaries</key>
+        <string>foundries</string>
+        <key>foundary</key>
+        <string>foundry</string>
+        <key>fourties</key>
+        <string>forties</string>
+        <key>fourty</key>
+        <string>forty</string>
+        <key>fouth</key>
+        <string>fourth</string>
+        <key>foward</key>
+        <string>forward</string>
+        <key>freind</key>
+        <string>friend</string>
+        <key>freindly</key>
+        <string>friendly</string>
+        <key>frequentily</key>
+        <string>frequently</string>
+        <key>frome</key>
+        <string>from</string>
+        <key>fromed</key>
+        <string>formed</string>
+        <key>froniter</key>
+        <string>frontier</string>
+        <key>fucntion</key>
+        <string>function</string>
+        <key>fucntioning</key>
+        <string>functioning</string>
+        <key>fufill</key>
+        <string>fulfill</string>
+        <key>fufilled</key>
+        <string>fulfilled</string>
+        <key>fulfiled</key>
+        <string>fulfilled</string>
+        <key>fullfill</key>
+        <string>fulfill</string>
+        <key>fullfilled</key>
+        <string>fulfilled</string>
+        <key>fundametal</key>
+        <string>fundamental</string>
+        <key>fundametals</key>
+        <string>fundamentals</string>
+        <key>funguses</key>
+        <string>fungi</string>
+        <key>funtion</key>
+        <string>function</string>
+        <key>furuther</key>
+        <string>further</string>
+        <key>futher</key>
+        <string>further</string>
+        <key>futhermore</key>
+        <string>furthermore</string>
+        <key>galatic</key>
+        <string>galactic</string>
+        <key>gallaxies</key>
+        <string>galaxies</string>
+        <key>galvinized</key>
+        <string>galvanized</string>
+        <key>ganerate</key>
+        <string>generate</string>
+        <key>ganes</key>
+        <string>games</string>
+        <key>ganster</key>
+        <string>gangster</string>
+        <key>garantee</key>
+        <string>guarantee</string>
+        <key>garanteed</key>
+        <string>guaranteed</string>
+        <key>garantees</key>
+        <string>guarantees</string>
+        <key>garnison</key>
+        <string>garrison</string>
+        <key>gaurantee</key>
+        <string>guarantee</string>
+        <key>gauranteed</key>
+        <string>guaranteed</string>
+        <key>gaurantees</key>
+        <string>guarantees</string>
+        <key>gaurd</key>
+        <string>guard</string>
+        <key>gaurentee</key>
+        <string>guarantee</string>
+        <key>gaurenteed</key>
+        <string>guaranteed</string>
+        <key>gaurentees</key>
+        <string>guarantees</string>
+        <key>geneological</key>
+        <string>genealogical</string>
+        <key>geneologies</key>
+        <string>genealogies</string>
+        <key>geneology</key>
+        <string>genealogy</string>
+        <key>generaly</key>
+        <string>generally</string>
+        <key>generatting</key>
+        <string>generating</string>
+        <key>genialia</key>
+        <string>genitalia</string>
+        <key>geographicial</key>
+        <string>geographical</string>
+        <key>geometrician</key>
+        <string>geometer</string>
+        <key>geometricians</key>
+        <string>geometers</string>
+        <key>gerat</key>
+        <string>great</string>
+        <key>glight</key>
+        <string>flight</string>
+        <key>gnawwed</key>
+        <string>gnawed</string>
+        <key>godess</key>
+        <string>goddess</string>
+        <key>godesses</key>
+        <string>goddesses</string>
+        <key>gogin</key>
+        <string>going</string>
+        <key>goign</key>
+        <string>going</string>
+        <key>gonig</key>
+        <string>going</string>
+        <key>gouvener</key>
+        <string>governor</string>
+        <key>govement</key>
+        <string>government</string>
+        <key>govenment</key>
+        <string>government</string>
+        <key>govenrment</key>
+        <string>government</string>
+        <key>goverance</key>
+        <string>governance</string>
+        <key>goverment</key>
+        <string>government</string>
+        <key>govermental</key>
+        <string>governmental</string>
+        <key>governer</key>
+        <string>governor</string>
+        <key>governmnet</key>
+        <string>government</string>
+        <key>govorment</key>
+        <string>government</string>
+        <key>govormental</key>
+        <string>governmental</string>
+        <key>govornment</key>
+        <string>government</string>
+        <key>gracefull</key>
+        <string>graceful</string>
+        <key>graet</key>
+        <string>great</string>
+        <key>grafitti</key>
+        <string>graffiti</string>
+        <key>gramatically</key>
+        <string>grammatically</string>
+        <key>grammaticaly</key>
+        <string>grammatically</string>
+        <key>grammer</key>
+        <string>grammar</string>
+        <key>grat</key>
+        <string>great</string>
+        <key>gratuitious</key>
+        <string>gratuitous</string>
+        <key>greatful</key>
+        <string>grateful</string>
+        <key>greatfully</key>
+        <string>gratefully</string>
+        <key>greif</key>
+        <string>grief</string>
+        <key>gridles</key>
+        <string>griddles</string>
+        <key>gropu</key>
+        <string>group</string>
+        <key>grwo</key>
+        <string>grow</string>
+        <key>guage</key>
+        <string>gauge</string>
+        <key>guarentee</key>
+        <string>guarantee</string>
+        <key>guarenteed</key>
+        <string>guaranteed</string>
+        <key>guarentees</key>
+        <string>guarantees</string>
+        <key>guerilla</key>
+        <string>guerrilla</string>
+        <key>guerillas</key>
+        <string>guerrillas</string>
+        <key>guerrila</key>
+        <string>guerrilla</string>
+        <key>guerrilas</key>
+        <string>guerrillas</string>
+        <key>guidence</key>
+        <string>guidance</string>
+        <key>gunanine</key>
+        <string>guanine</string>
+        <key>gurantee</key>
+        <string>guarantee</string>
+        <key>guranteed</key>
+        <string>guaranteed</string>
+        <key>gurantees</key>
+        <string>guarantees</string>
+        <key>guttaral</key>
+        <string>guttural</string>
+        <key>gutteral</key>
+        <string>guttural</string>
+        <key>habaeus</key>
+        <string>habeas</string>
+        <key>habeus</key>
+        <string>habeas</string>
+        <key>haemorrage</key>
+        <string>haemorrhage</string>
+        <key>haev</key>
+        <string>have</string>
+        <key>halp</key>
+        <string>help</string>
+        <key>hapen</key>
+        <string>happen</string>
+        <key>hapened</key>
+        <string>happened</string>
+        <key>hapening</key>
+        <string>happening</string>
+        <key>happend</key>
+        <string>happened</string>
+        <key>happended</key>
+        <string>happened</string>
+        <key>happenned</key>
+        <string>happened</string>
+        <key>harased</key>
+        <string>harassed</string>
+        <key>harases</key>
+        <string>harasses</string>
+        <key>harasment</key>
+        <string>harassment</string>
+        <key>harasments</key>
+        <string>harassments</string>
+        <key>harassement</key>
+        <string>harassment</string>
+        <key>harras</key>
+        <string>harass</string>
+        <key>harrased</key>
+        <string>harassed</string>
+        <key>harrases</key>
+        <string>harasses</string>
+        <key>harrasing</key>
+        <string>harassing</string>
+        <key>harrasment</key>
+        <string>harassment</string>
+        <key>harrasments</key>
+        <string>harassments</string>
+        <key>harrassed</key>
+        <string>harassed</string>
+        <key>harrasses</key>
+        <string>harassed</string>
+        <key>harrassing</key>
+        <string>harassing</string>
+        <key>harrassment</key>
+        <string>harassment</string>
+        <key>harrassments</key>
+        <string>harassments</string>
+        <key>hasnt</key>
+        <string>hasn&apos;t</string>
+        <key>haviest</key>
+        <string>heaviest</string>
+        <key>headquarer</key>
+        <string>headquarter</string>
+        <key>headquater</key>
+        <string>headquarter</string>
+        <key>headquatered</key>
+        <string>headquartered</string>
+        <key>headquaters</key>
+        <string>headquarters</string>
+        <key>healthercare</key>
+        <string>healthcare</string>
+        <key>heared</key>
+        <string>heard</string>
+        <key>heathy</key>
+        <string>healthy</string>
+        <key>heigher</key>
+        <string>higher</string>
+        <key>heirarchy</key>
+        <string>hierarchy</string>
+        <key>heiroglyphics</key>
+        <string>hieroglyphics</string>
+        <key>helment</key>
+        <string>helmet</string>
+        <key>helpfull</key>
+        <string>helpful</string>
+        <key>helpped</key>
+        <string>helped</string>
+        <key>hemmorhage</key>
+        <string>hemorrhage</string>
+        <key>herad</key>
+        <string>heard</string>
+        <key>heridity</key>
+        <string>heredity</string>
+        <key>heroe</key>
+        <string>hero</string>
+        <key>heros</key>
+        <string>heroes</string>
+        <key>hertiage</key>
+        <string>heritage</string>
+        <key>hertzs</key>
+        <string>hertz</string>
+        <key>hesistant</key>
+        <string>hesitant</string>
+        <key>heterogenous</key>
+        <string>heterogeneous</string>
+        <key>hieght</key>
+        <string>height</string>
+        <key>hierachical</key>
+        <string>hierarchical</string>
+        <key>hierachies</key>
+        <string>hierarchies</string>
+        <key>hierachy</key>
+        <string>hierarchy</string>
+        <key>hierarcical</key>
+        <string>hierarchical</string>
+        <key>hierarcy</key>
+        <string>hierarchy</string>
+        <key>hieroglph</key>
+        <string>hieroglyph</string>
+        <key>hieroglphs</key>
+        <string>hieroglyphs</string>
+        <key>higer</key>
+        <string>higher</string>
+        <key>higest</key>
+        <string>highest</string>
+        <key>higway</key>
+        <string>highway</string>
+        <key>hillarious</key>
+        <string>hilarious</string>
+        <key>himselv</key>
+        <string>himself</string>
+        <key>hinderance</key>
+        <string>hindrance</string>
+        <key>hinderence</key>
+        <string>hindrance</string>
+        <key>hindrence</key>
+        <string>hindrance</string>
+        <key>hipopotamus</key>
+        <string>hippopotamus</string>
+        <key>hismelf</key>
+        <string>himself</string>
+        <key>histocompatability</key>
+        <string>histocompatibility</string>
+        <key>historicians</key>
+        <string>historians</string>
+        <key>hitsingles</key>
+        <string>hit singles</string>
+        <key>holliday</key>
+        <string>holiday</string>
+        <key>homestate</key>
+        <string>home state</string>
+        <key>homogeneize</key>
+        <string>homogenize</string>
+        <key>homogeneized</key>
+        <string>homogenized</string>
+        <key>honory</key>
+        <string>honorary</string>
+        <key>horrifing</key>
+        <string>horrifying</string>
+        <key>hosited</key>
+        <string>hoisted</string>
+        <key>hospitible</key>
+        <string>hospitable</string>
+        <key>hounour</key>
+        <string>honour</string>
+        <key>housr</key>
+        <string>hours</string>
+        <key>howver</key>
+        <string>however</string>
+        <key>hsitorians</key>
+        <string>historians</string>
+        <key>hstory</key>
+        <string>history</string>
+        <key>hten</key>
+        <string>then</string>
+        <key>htere</key>
+        <string>there</string>
+        <key>htey</key>
+        <string>they</string>
+        <key>htikn</key>
+        <string>think</string>
+        <key>hting</key>
+        <string>thing</string>
+        <key>htink</key>
+        <string>think</string>
+        <key>htis</key>
+        <string>this</string>
+        <key>humer</key>
+        <string>humor</string>
+        <key>humerous</key>
+        <string>humorous</string>
+        <key>huminoid</key>
+        <string>humanoid</string>
+        <key>humoural</key>
+        <string>humoral</string>
+        <key>humurous</key>
+        <string>humorous</string>
+        <key>husban</key>
+        <string>husband</string>
+        <key>hvae</key>
+        <string>have</string>
+        <key>hvaing</key>
+        <string>having</string>
+        <key>hvea</key>
+        <string>have</string>
+        <key>hwihc</key>
+        <string>which</string>
+        <key>hwile</key>
+        <string>while</string>
+        <key>hwole</key>
+        <string>whole</string>
+        <key>hydogen</key>
+        <string>hydrogen</string>
+        <key>hydropile</key>
+        <string>hydrophile</string>
+        <key>hydropilic</key>
+        <string>hydrophilic</string>
+        <key>hydropobe</key>
+        <string>hydrophobe</string>
+        <key>hydropobic</key>
+        <string>hydrophobic</string>
+        <key>hygeine</key>
+        <string>hygiene</string>
+        <key>hypocracy</key>
+        <string>hypocrisy</string>
+        <key>hypocrasy</key>
+        <string>hypocrisy</string>
+        <key>hypocricy</key>
+        <string>hypocrisy</string>
+        <key>hypocrit</key>
+        <string>hypocrite</string>
+        <key>hypocrits</key>
+        <string>hypocrites</string>
+        <key>i</key>
+        <string>I</string>
+        <key>iconclastic</key>
+        <string>iconoclastic</string>
+        <key>idaeidae</key>
+        <string>idea</string>
+        <key>idaes</key>
+        <string>ideas</string>
+        <key>idealogies</key>
+        <string>ideologies</string>
+        <key>idealogy</key>
+        <string>ideology</string>
+        <key>identicial</key>
+        <string>identical</string>
+        <key>identifers</key>
+        <string>identifiers</string>
+        <key>ideosyncratic</key>
+        <string>idiosyncratic</string>
+        <key>idesa</key>
+        <string>ideas</string>
+        <key>idiosyncracy</key>
+        <string>idiosyncrasy</string>
+        <key>illegimacy</key>
+        <string>illegitimacy</string>
+        <key>illegitmate</key>
+        <string>illegitimate</string>
+        <key>illess</key>
+        <string>illness</string>
+        <key>illiegal</key>
+        <string>illegal</string>
+        <key>illution</key>
+        <string>illusion</string>
+        <key>ilness</key>
+        <string>illness</string>
+        <key>ilogical</key>
+        <string>illogical</string>
+        <key>imagenary</key>
+        <string>imaginary</string>
+        <key>imagin</key>
+        <string>imagine</string>
+        <key>imaginery</key>
+        <string>imaginary</string>
+        <key>imcomplete</key>
+        <string>incomplete</string>
+        <key>imediately</key>
+        <string>immediately</string>
+        <key>imense</key>
+        <string>immense</string>
+        <key>immediatley</key>
+        <string>immediately</string>
+        <key>immediatly</key>
+        <string>immediately</string>
+        <key>immidately</key>
+        <string>immediately</string>
+        <key>immidiately</key>
+        <string>immediately</string>
+        <key>immitate</key>
+        <string>imitate</string>
+        <key>immitated</key>
+        <string>imitated</string>
+        <key>immitating</key>
+        <string>imitating</string>
+        <key>immitator</key>
+        <string>imitator</string>
+        <key>immunosupressant</key>
+        <string>immunosuppressant</string>
+        <key>impecabbly</key>
+        <string>impeccably</string>
+        <key>impedence</key>
+        <string>impedance</string>
+        <key>implamenting</key>
+        <string>implementing</string>
+        <key>impliment</key>
+        <string>implement</string>
+        <key>implimented</key>
+        <string>implemented</string>
+        <key>imploys</key>
+        <string>employs</string>
+        <key>importamt</key>
+        <string>important</string>
+        <key>imprioned</key>
+        <string>imprisoned</string>
+        <key>imprisonned</key>
+        <string>imprisoned</string>
+        <key>improvision</key>
+        <string>improvisation</string>
+        <key>improvments</key>
+        <string>improvements</string>
+        <key>inablility</key>
+        <string>inability</string>
+        <key>inaccessable</key>
+        <string>inaccessible</string>
+        <key>inadiquate</key>
+        <string>inadequate</string>
+        <key>inadquate</key>
+        <string>inadequate</string>
+        <key>inadvertant</key>
+        <string>inadvertent</string>
+        <key>inadvertantly</key>
+        <string>inadvertently</string>
+        <key>inagurated</key>
+        <string>inaugurated</string>
+        <key>inaguration</key>
+        <string>inauguration</string>
+        <key>inappropiate</key>
+        <string>inappropriate</string>
+        <key>inaugures</key>
+        <string>inaugurates</string>
+        <key>inbalance</key>
+        <string>imbalance</string>
+        <key>inbalanced</key>
+        <string>imbalanced</string>
+        <key>inbetween</key>
+        <string>between</string>
+        <key>incarcirated</key>
+        <string>incarcerated</string>
+        <key>incidentially</key>
+        <string>incidentally</string>
+        <key>incidently</key>
+        <string>incidentally</string>
+        <key>inclreased</key>
+        <string>increased</string>
+        <key>includ</key>
+        <string>include</string>
+        <key>includng</key>
+        <string>including</string>
+        <key>incompatabilities</key>
+        <string>incompatibilities</string>
+        <key>incompatability</key>
+        <string>incompatibility</string>
+        <key>incompatable</key>
+        <string>incompatible</string>
+        <key>incompatablities</key>
+        <string>incompatibilities</string>
+        <key>incompatablity</key>
+        <string>incompatibility</string>
+        <key>incompatiblities</key>
+        <string>incompatibilities</string>
+        <key>incompatiblity</key>
+        <string>incompatibility</string>
+        <key>incompetance</key>
+        <string>incompetence</string>
+        <key>incompetant</key>
+        <string>incompetent</string>
+        <key>incomptable</key>
+        <string>incompatible</string>
+        <key>incomptetent</key>
+        <string>incompetent</string>
+        <key>inconsistant</key>
+        <string>inconsistent</string>
+        <key>incoroporated</key>
+        <string>incorporated</string>
+        <key>incorperation</key>
+        <string>incorporation</string>
+        <key>incorportaed</key>
+        <string>incorporated</string>
+        <key>incorprates</key>
+        <string>incorporates</string>
+        <key>incorruptable</key>
+        <string>incorruptible</string>
+        <key>incramentally</key>
+        <string>incrementally</string>
+        <key>increadible</key>
+        <string>incredible</string>
+        <key>incredable</key>
+        <string>incredible</string>
+        <key>inctroduce</key>
+        <string>introduce</string>
+        <key>inctroduced</key>
+        <string>introduced</string>
+        <key>incuding</key>
+        <string>including</string>
+        <key>incunabla</key>
+        <string>incunabula</string>
+        <key>indefinately</key>
+        <string>indefinitely</string>
+        <key>indefineable</key>
+        <string>undefinable</string>
+        <key>indefinitly</key>
+        <string>indefinitely</string>
+        <key>indentical</key>
+        <string>identical</string>
+        <key>indepedantly</key>
+        <string>independently</string>
+        <key>indepedence</key>
+        <string>independence</string>
+        <key>independance</key>
+        <string>independence</string>
+        <key>independant</key>
+        <string>independent</string>
+        <key>independantly</key>
+        <string>independently</string>
+        <key>independece</key>
+        <string>independence</string>
+        <key>independendet</key>
+        <string>independent</string>
+        <key>indespensable</key>
+        <string>indispensable</string>
+        <key>indespensible</key>
+        <string>indispensable</string>
+        <key>indictement</key>
+        <string>indictment</string>
+        <key>indigineous</key>
+        <string>indigenous</string>
+        <key>indipendence</key>
+        <string>independence</string>
+        <key>indipendent</key>
+        <string>independent</string>
+        <key>indipendently</key>
+        <string>independently</string>
+        <key>indispensible</key>
+        <string>indispensable</string>
+        <key>indisputible</key>
+        <string>indisputable</string>
+        <key>indisputibly</key>
+        <string>indisputably</string>
+        <key>indite</key>
+        <string>indict</string>
+        <key>individualy</key>
+        <string>individually</string>
+        <key>indpendent</key>
+        <string>independent</string>
+        <key>indpendently</key>
+        <string>independently</string>
+        <key>indulgue</key>
+        <string>indulge</string>
+        <key>indutrial</key>
+        <string>industrial</string>
+        <key>indviduals</key>
+        <string>individuals</string>
+        <key>inefficienty</key>
+        <string>inefficiently</string>
+        <key>inevatible</key>
+        <string>inevitable</string>
+        <key>inevitible</key>
+        <string>inevitable</string>
+        <key>inevititably</key>
+        <string>inevitably</string>
+        <key>infalability</key>
+        <string>infallibility</string>
+        <key>infallable</key>
+        <string>infallible</string>
+        <key>infectuous</key>
+        <string>infectious</string>
+        <key>infered</key>
+        <string>inferred</string>
+        <key>infilitrate</key>
+        <string>infiltrate</string>
+        <key>infilitrated</key>
+        <string>infiltrated</string>
+        <key>infilitration</key>
+        <string>infiltration</string>
+        <key>infinit</key>
+        <string>infinite</string>
+        <key>inflamation</key>
+        <string>inflammation</string>
+        <key>influencial</key>
+        <string>influential</string>
+        <key>influented</key>
+        <string>influenced</string>
+        <key>infomation</key>
+        <string>information</string>
+        <key>informtion</key>
+        <string>information</string>
+        <key>infrantryman</key>
+        <string>infantryman</string>
+        <key>infrigement</key>
+        <string>infringement</string>
+        <key>ingenius</key>
+        <string>ingenious</string>
+        <key>ingreediants</key>
+        <string>ingredients</string>
+        <key>inhabitans</key>
+        <string>inhabitants</string>
+        <key>inherantly</key>
+        <string>inherently</string>
+        <key>inheritence</key>
+        <string>inheritance</string>
+        <key>inital</key>
+        <string>initial</string>
+        <key>initally</key>
+        <string>initially</string>
+        <key>initation</key>
+        <string>initiation</string>
+        <key>initiaitive</key>
+        <string>initiative</string>
+        <key>inlcuding</key>
+        <string>including</string>
+        <key>inmigrant</key>
+        <string>immigrant</string>
+        <key>inmigrants</key>
+        <string>immigrants</string>
+        <key>innoculated</key>
+        <string>inoculated</string>
+        <key>inocence</key>
+        <string>innocence</string>
+        <key>inofficial</key>
+        <string>unofficial</string>
+        <key>inot</key>
+        <string>into</string>
+        <key>inpeach</key>
+        <string>impeach</string>
+        <key>inpolite</key>
+        <string>impolite</string>
+        <key>inprisonment</key>
+        <string>imprisonment</string>
+        <key>inproving</key>
+        <string>improving</string>
+        <key>insectiverous</key>
+        <string>insectivorous</string>
+        <key>insensative</key>
+        <string>insensitive</string>
+        <key>inseperable</key>
+        <string>inseparable</string>
+        <key>insistance</key>
+        <string>insistence</string>
+        <key>insitution</key>
+        <string>institution</string>
+        <key>insitutions</key>
+        <string>institutions</string>
+        <key>inspite</key>
+        <string>in spite</string>
+        <key>instade</key>
+        <string>instead</string>
+        <key>instatance</key>
+        <string>instance</string>
+        <key>institue</key>
+        <string>institute</string>
+        <key>instuction</key>
+        <string>instruction</string>
+        <key>instuments</key>
+        <string>instruments</string>
+        <key>instutionalized</key>
+        <string>institutionalized</string>
+        <key>instutions</key>
+        <string>intuitions</string>
+        <key>insurence</key>
+        <string>insurance</string>
+        <key>intelectual</key>
+        <string>intellectual</string>
+        <key>inteligence</key>
+        <string>intelligence</string>
+        <key>inteligent</key>
+        <string>intelligent</string>
+        <key>intenational</key>
+        <string>international</string>
+        <key>intented</key>
+        <string>intended</string>
+        <key>intepretation</key>
+        <string>interpretation</string>
+        <key>intepretator</key>
+        <string>interpretor</string>
+        <key>interational</key>
+        <string>international</string>
+        <key>interbread</key>
+        <string>interbreed</string>
+        <key>interchangable</key>
+        <string>interchangeable</string>
+        <key>interchangably</key>
+        <string>interchangeably</string>
+        <key>intercontinetal</key>
+        <string>intercontinental</string>
+        <key>intered</key>
+        <string>interred</string>
+        <key>interelated</key>
+        <string>interrelated</string>
+        <key>interferance</key>
+        <string>interference</string>
+        <key>interfereing</key>
+        <string>interfering</string>
+        <key>intergrated</key>
+        <string>integrated</string>
+        <key>intergration</key>
+        <string>integration</string>
+        <key>interm</key>
+        <string>interim</string>
+        <key>internation</key>
+        <string>international</string>
+        <key>interpet</key>
+        <string>interpret</string>
+        <key>interrim</key>
+        <string>interim</string>
+        <key>interrugum</key>
+        <string>interregnum</string>
+        <key>intertaining</key>
+        <string>entertaining</string>
+        <key>interupt</key>
+        <string>interrupt</string>
+        <key>intervines</key>
+        <string>intervenes</string>
+        <key>intevene</key>
+        <string>intervene</string>
+        <key>intial</key>
+        <string>initial</string>
+        <key>intially</key>
+        <string>initially</string>
+        <key>intrduced</key>
+        <string>introduced</string>
+        <key>intrest</key>
+        <string>interest</string>
+        <key>introdued</key>
+        <string>introduced</string>
+        <key>intruduced</key>
+        <string>introduced</string>
+        <key>intrument</key>
+        <string>instrument</string>
+        <key>intrumental</key>
+        <string>instrumental</string>
+        <key>intruments</key>
+        <string>instruments</string>
+        <key>intrusted</key>
+        <string>entrusted</string>
+        <key>intutive</key>
+        <string>intuitive</string>
+        <key>intutively</key>
+        <string>intuitively</string>
+        <key>inudstry</key>
+        <string>industry</string>
+        <key>inventer</key>
+        <string>inventor</string>
+        <key>invertibrates</key>
+        <string>invertebrates</string>
+        <key>investingate</key>
+        <string>investigate</string>
+        <key>involvment</key>
+        <string>involvement</string>
+        <key>irelevent</key>
+        <string>irrelevant</string>
+        <key>iresistable</key>
+        <string>irresistible</string>
+        <key>iresistably</key>
+        <string>irresistibly</string>
+        <key>iresistible</key>
+        <string>irresistible</string>
+        <key>iresistibly</key>
+        <string>irresistibly</string>
+        <key>iritable</key>
+        <string>irritable</string>
+        <key>iritated</key>
+        <string>irritated</string>
+        <key>ironicly</key>
+        <string>ironically</string>
+        <key>irregardless</key>
+        <string>regardless</string>
+        <key>irrelevent</key>
+        <string>irrelevant</string>
+        <key>irreplacable</key>
+        <string>irreplaceable</string>
+        <key>irresistable</key>
+        <string>irresistible</string>
+        <key>irresistably</key>
+        <string>irresistibly</string>
+        <key>isnt</key>
+        <string>isn&apos;t</string>
+        <key>issueing</key>
+        <string>issuing</string>
+        <key>itnroduced</key>
+        <string>introduced</string>
+        <key>iunior</key>
+        <string>junior</string>
+        <key>iwll</key>
+        <string>will</string>
+        <key>iwth</key>
+        <string>with</string>
+        <key>jaques</key>
+        <string>jacques</string>
+        <key>jeapardy</key>
+        <string>jeopardy</string>
+        <key>jewllery</key>
+        <string>jewellery</string>
+        <key>jouney</key>
+        <string>journey</string>
+        <key>journied</key>
+        <string>journeyed</string>
+        <key>journies</key>
+        <string>journeys</string>
+        <key>jstu</key>
+        <string>just</string>
+        <key>jsut</key>
+        <string>just</string>
+        <key>judical</key>
+        <string>judicial</string>
+        <key>judisuary</key>
+        <string>judiciary</string>
+        <key>juducial</key>
+        <string>judicial</string>
+        <key>juristiction</key>
+        <string>jurisdiction</string>
+        <key>juristictions</key>
+        <string>jurisdictions</string>
+        <key>kindergarden</key>
+        <string>kindergarten</string>
+        <key>klenex</key>
+        <string>kleenex</string>
+        <key>knifes</key>
+        <string>knives</string>
+        <key>knive</key>
+        <string>knife</string>
+        <key>knowlege</key>
+        <string>knowledge</string>
+        <key>knowlegeable</key>
+        <string>knowledgeable</string>
+        <key>knwo</key>
+        <string>know</string>
+        <key>knwos</key>
+        <string>knows</string>
+        <key>konw</key>
+        <string>know</string>
+        <key>konws</key>
+        <string>knows</string>
+        <key>kwno</key>
+        <string>know</string>
+        <key>labatory</key>
+        <string>laboratory</string>
+        <key>labratory</key>
+        <string>laboratory</string>
+        <key>laguage</key>
+        <string>language</string>
+        <key>laguages</key>
+        <string>languages</string>
+        <key>larg</key>
+        <string>large</string>
+        <key>largst</key>
+        <string>largest</string>
+        <key>larrry</key>
+        <string>larry</string>
+        <key>lastr</key>
+        <string>last</string>
+        <key>lattitude</key>
+        <string>latitude</string>
+        <key>launhed</key>
+        <string>launched</string>
+        <key>lavae</key>
+        <string>larvae</string>
+        <key>layed</key>
+        <string>laid</string>
+        <key>lazyness</key>
+        <string>laziness</string>
+        <key>leage</key>
+        <string>league</string>
+        <key>leanr</key>
+        <string>learn</string>
+        <key>leathal</key>
+        <string>lethal</string>
+        <key>lefted</key>
+        <string>left</string>
+        <key>legitamate</key>
+        <string>legitimate</string>
+        <key>legitmate</key>
+        <string>legitimate</string>
+        <key>leibnitz</key>
+        <string>leibniz</string>
+        <key>lenght</key>
+        <string>length</string>
+        <key>leran</key>
+        <string>learn</string>
+        <key>lerans</key>
+        <string>learns</string>
+        <key>leutenant</key>
+        <string>lieutenant</string>
+        <key>levetate</key>
+        <string>levitate</string>
+        <key>levetated</key>
+        <string>levitated</string>
+        <key>levetates</key>
+        <string>levitates</string>
+        <key>levetating</key>
+        <string>levitating</string>
+        <key>levle</key>
+        <string>level</string>
+        <key>liasion</key>
+        <string>liaison</string>
+        <key>liason</key>
+        <string>liaison</string>
+        <key>liasons</key>
+        <string>liaisons</string>
+        <key>libary</key>
+        <string>library</string>
+        <key>libell</key>
+        <string>libel</string>
+        <key>libguistic</key>
+        <string>linguistic</string>
+        <key>libguistics</key>
+        <string>linguistics</string>
+        <key>libitarianisn</key>
+        <string>libertarianism</string>
+        <key>lieing</key>
+        <string>lying</string>
+        <key>liek</key>
+        <string>like</string>
+        <key>liekd</key>
+        <string>liked</string>
+        <key>liesure</key>
+        <string>leisure</string>
+        <key>lieuenant</key>
+        <string>lieutenant</string>
+        <key>lieved</key>
+        <string>lived</string>
+        <key>liftime</key>
+        <string>lifetime</string>
+        <key>lightyear</key>
+        <string>light year</string>
+        <key>lightyears</key>
+        <string>light years</string>
+        <key>likelyhood</key>
+        <string>likelihood</string>
+        <key>linnaena</key>
+        <string>linnaean</string>
+        <key>lippizaner</key>
+        <string>lipizzaner</string>
+        <key>liquify</key>
+        <string>liquefy</string>
+        <key>liscense</key>
+        <string>license</string>
+        <key>lisence</key>
+        <string>license</string>
+        <key>lisense</key>
+        <string>license</string>
+        <key>listners</key>
+        <string>listeners</string>
+        <key>litature</key>
+        <string>literature</string>
+        <key>literaly</key>
+        <string>literally</string>
+        <key>literture</key>
+        <string>literature</string>
+        <key>littel</key>
+        <string>little</string>
+        <key>litterally</key>
+        <string>literally</string>
+        <key>liuke</key>
+        <string>like</string>
+        <key>livley</key>
+        <string>lively</string>
+        <key>lmits</key>
+        <string>limits</string>
+        <key>loev</key>
+        <string>love</string>
+        <key>lonelyness</key>
+        <string>loneliness</string>
+        <key>longitudonal</key>
+        <string>longitudinal</string>
+        <key>lonley</key>
+        <string>lonely</string>
+        <key>lonly</key>
+        <string>lonely</string>
+        <key>loosing</key>
+        <string>losing</string>
+        <key>lotharingen</key>
+        <string>lothringen</string>
+        <key>lsat</key>
+        <string>last</string>
+        <key>lukid</key>
+        <string>likud</string>
+        <key>lveo</key>
+        <string>love</string>
+        <key>lvoe</key>
+        <string>love</string>
+        <key>maching</key>
+        <string>machine</string>
+        <key>mackeral</key>
+        <string>mackerel</string>
+        <key>magasine</key>
+        <string>magazine</string>
+        <key>magincian</key>
+        <string>magician</string>
+        <key>magnificient</key>
+        <string>magnificent</string>
+        <key>magolia</key>
+        <string>magnolia</string>
+        <key>mailny</key>
+        <string>mainly</string>
+        <key>maintainance</key>
+        <string>maintenance</string>
+        <key>maintainence</key>
+        <string>maintenance</string>
+        <key>maintance</key>
+        <string>maintenance</string>
+        <key>maintenence</key>
+        <string>maintenance</string>
+        <key>maintinaing</key>
+        <string>maintaining</string>
+        <key>maintioned</key>
+        <string>mentioned</string>
+        <key>majoroty</key>
+        <string>majority</string>
+        <key>maked</key>
+        <string>marked</string>
+        <key>makse</key>
+        <string>makes</string>
+        <key>maltesian</key>
+        <string>Maltese</string>
+        <key>mamal</key>
+        <string>mammal</string>
+        <key>mamalian</key>
+        <string>mammalian</string>
+        <key>managable</key>
+        <string>manageable</string>
+        <key>managment</key>
+        <string>management</string>
+        <key>maneouvre</key>
+        <string>manoeuvre</string>
+        <key>maneouvred</key>
+        <string>manoeuvred</string>
+        <key>maneouvres</key>
+        <string>manoeuvres</string>
+        <key>maneouvring</key>
+        <string>manoeuvring</string>
+        <key>manisfestations</key>
+        <string>manifestations</string>
+        <key>manoeuverability</key>
+        <string>maneuverability</string>
+        <key>manouver</key>
+        <string>maneuver</string>
+        <key>manouverability</key>
+        <string>maneuverability</string>
+        <key>manouverable</key>
+        <string>maneuverable</string>
+        <key>manouvers</key>
+        <string>maneuvers</string>
+        <key>mantained</key>
+        <string>maintained</string>
+        <key>manuever</key>
+        <string>maneuver</string>
+        <key>manuevers</key>
+        <string>maneuvers</string>
+        <key>manufacturedd</key>
+        <string>manufactured</string>
+        <key>manufature</key>
+        <string>manufacture</string>
+        <key>manufatured</key>
+        <string>manufactured</string>
+        <key>manufaturing</key>
+        <string>manufacturing</string>
+        <key>manuver</key>
+        <string>maneuver</string>
+        <key>mariage</key>
+        <string>marriage</string>
+        <key>marjority</key>
+        <string>majority</string>
+        <key>markes</key>
+        <string>marks</string>
+        <key>marketting</key>
+        <string>marketing</string>
+        <key>marmelade</key>
+        <string>marmalade</string>
+        <key>marrage</key>
+        <string>marriage</string>
+        <key>marraige</key>
+        <string>marriage</string>
+        <key>marrtyred</key>
+        <string>martyred</string>
+        <key>marryied</key>
+        <string>married</string>
+        <key>massmedia</key>
+        <string>mass media</string>
+        <key>masterbation</key>
+        <string>masturbation</string>
+        <key>mataphysical</key>
+        <string>metaphysical</string>
+        <key>materalists</key>
+        <string>materialist</string>
+        <key>mathamatics</key>
+        <string>mathematics</string>
+        <key>mathematican</key>
+        <string>mathematician</string>
+        <key>mathematicas</key>
+        <string>mathematics</string>
+        <key>matheticians</key>
+        <string>mathematicians</string>
+        <key>mathmatically</key>
+        <string>mathematically</string>
+        <key>mathmatician</key>
+        <string>mathematician</string>
+        <key>mathmaticians</key>
+        <string>mathematicians</string>
+        <key>mccarthyst</key>
+        <string>mccarthyist</string>
+        <key>mchanics</key>
+        <string>mechanics</string>
+        <key>meaninng</key>
+        <string>meaning</string>
+        <key>mear</key>
+        <string>wear</string>
+        <key>mechandise</key>
+        <string>merchandise</string>
+        <key>medacine</key>
+        <string>medicine</string>
+        <key>medeival</key>
+        <string>medieval</string>
+        <key>medevial</key>
+        <string>medieval</string>
+        <key>mediciney</key>
+        <string>mediciny</string>
+        <key>medievel</key>
+        <string>medieval</string>
+        <key>mediterainnean</key>
+        <string>mediterranean</string>
+        <key>meerkrat</key>
+        <string>meerkat</string>
+        <key>melieux</key>
+        <string>milieux</string>
+        <key>membranaphone</key>
+        <string>membranophone</string>
+        <key>memeber</key>
+        <string>member</string>
+        <key>menally</key>
+        <string>mentally</string>
+        <key>meranda</key>
+        <string>Miranda</string>
+        <key>mercentile</key>
+        <string>mercantile</string>
+        <key>messanger</key>
+        <string>messenger</string>
+        <key>messenging</key>
+        <string>messaging</string>
+        <key>metalic</key>
+        <string>metallic</string>
+        <key>metalurgic</key>
+        <string>metallurgic</string>
+        <key>metalurgical</key>
+        <string>metallurgical</string>
+        <key>metalurgy</key>
+        <string>metallurgy</string>
+        <key>metamorphysis</key>
+        <string>metamorphosis</string>
+        <key>metaphoricial</key>
+        <string>metaphorical</string>
+        <key>meterologist</key>
+        <string>meteorologist</string>
+        <key>meterology</key>
+        <string>meteorology</string>
+        <key>methaphor</key>
+        <string>metaphor</string>
+        <key>methaphors</key>
+        <string>metaphors</string>
+        <key>micoscopy</key>
+        <string>microscopy</string>
+        <key>midwifes</key>
+        <string>midwives</string>
+        <key>mileau</key>
+        <string>milieu</string>
+        <key>milennia</key>
+        <string>millennia</string>
+        <key>milennium</key>
+        <string>millennium</string>
+        <key>mileu</key>
+        <string>milieu</string>
+        <key>miliary</key>
+        <string>military</string>
+        <key>milion</key>
+        <string>million</string>
+        <key>miliraty</key>
+        <string>military</string>
+        <key>millenia</key>
+        <string>millennia</string>
+        <key>millenial</key>
+        <string>millennial</string>
+        <key>millenialism</key>
+        <string>millennialism</string>
+        <key>millenium</key>
+        <string>millennium</string>
+        <key>millepede</key>
+        <string>millipede</string>
+        <key>millioniare</key>
+        <string>millionaire</string>
+        <key>millitary</key>
+        <string>military</string>
+        <key>millon</key>
+        <string>million</string>
+        <key>miltary</key>
+        <string>military</string>
+        <key>minature</key>
+        <string>miniature</string>
+        <key>minerial</key>
+        <string>mineral</string>
+        <key>miniscule</key>
+        <string>minuscule</string>
+        <key>ministery</key>
+        <string>ministry</string>
+        <key>minstries</key>
+        <string>ministries</string>
+        <key>minstry</key>
+        <string>ministry</string>
+        <key>minumum</key>
+        <string>minimum</string>
+        <key>mirrorred</key>
+        <string>mirrored</string>
+        <key>miscelaneous</key>
+        <string>miscellaneous</string>
+        <key>miscellanious</key>
+        <string>miscellaneous</string>
+        <key>miscellanous</key>
+        <string>miscellaneous</string>
+        <key>mischeivous</key>
+        <string>mischievous</string>
+        <key>mischevious</key>
+        <string>mischievous</string>
+        <key>mischievious</key>
+        <string>mischievous</string>
+        <key>misdameanor</key>
+        <string>misdemeanor</string>
+        <key>misdameanors</key>
+        <string>misdemeanors</string>
+        <key>misdemenor</key>
+        <string>misdemeanor</string>
+        <key>misdemenors</key>
+        <string>misdemeanors</string>
+        <key>misfourtunes</key>
+        <string>misfortunes</string>
+        <key>misile</key>
+        <string>missile</string>
+        <key>mispell</key>
+        <string>misspell</string>
+        <key>mispelled</key>
+        <string>misspelled</string>
+        <key>mispelling</key>
+        <string>misspelling</string>
+        <key>missen</key>
+        <string>mizzen</string>
+        <key>missle</key>
+        <string>missile</string>
+        <key>missonary</key>
+        <string>missionary</string>
+        <key>misterious</key>
+        <string>mysterious</string>
+        <key>mistery</key>
+        <string>mystery</string>
+        <key>misteryous</key>
+        <string>mysterious</string>
+        <key>mkae</key>
+        <string>make</string>
+        <key>mkaes</key>
+        <string>makes</string>
+        <key>mkaing</key>
+        <string>making</string>
+        <key>mkea</key>
+        <string>make</string>
+        <key>moderm</key>
+        <string>modem</string>
+        <key>modle</key>
+        <string>model</string>
+        <key>moent</key>
+        <string>moment</string>
+        <key>moeny</key>
+        <string>money</string>
+        <key>mohammedans</key>
+        <string>muslims</string>
+        <key>moil</key>
+        <string>soil</string>
+        <key>moleclues</key>
+        <string>molecules</string>
+        <key>momento</key>
+        <string>memento</string>
+        <key>monestaries</key>
+        <string>monasteries</string>
+        <key>monestary</key>
+        <string>monastery</string>
+        <key>monickers</key>
+        <string>monikers</string>
+        <key>monolite</key>
+        <string>monolithic</string>
+        <key>montains</key>
+        <string>mountains</string>
+        <key>montanous</key>
+        <string>mountainous</string>
+        <key>monts</key>
+        <string>months</string>
+        <key>montypic</key>
+        <string>monotypic</string>
+        <key>moreso</key>
+        <string>more so</string>
+        <key>morgage</key>
+        <string>mortgage</string>
+        <key>morroccan</key>
+        <string>moroccan</string>
+        <key>morrocco</key>
+        <string>morocco</string>
+        <key>morroco</key>
+        <string>morocco</string>
+        <key>mortage</key>
+        <string>mortgage</string>
+        <key>mosture</key>
+        <string>moisture</string>
+        <key>motiviated</key>
+        <string>motivated</string>
+        <key>mounth</key>
+        <string>month</string>
+        <key>movei</key>
+        <string>movie</string>
+        <key>movment</key>
+        <string>movement</string>
+        <key>mroe</key>
+        <string>more</string>
+        <key>mucuous</key>
+        <string>mucous</string>
+        <key>muder</key>
+        <string>murder</string>
+        <key>mudering</key>
+        <string>murdering</string>
+        <key>muhammadan</key>
+        <string>muslim</string>
+        <key>multicultralism</key>
+        <string>multiculturalism</string>
+        <key>multipled</key>
+        <string>multiplied</string>
+        <key>multiplers</key>
+        <string>multipliers</string>
+        <key>munbers</key>
+        <string>numbers</string>
+        <key>muncipalities</key>
+        <string>municipalities</string>
+        <key>muncipality</key>
+        <string>municipality</string>
+        <key>munnicipality</key>
+        <string>municipality</string>
+        <key>muscels</key>
+        <string>muscles</string>
+        <key>muscial</key>
+        <string>musical</string>
+        <key>muscician</key>
+        <string>musician</string>
+        <key>muscicians</key>
+        <string>musicians</string>
+        <key>mutiliated</key>
+        <string>mutilated</string>
+        <key>myraid</key>
+        <string>myriad</string>
+        <key>mysef</key>
+        <string>myself</string>
+        <key>mysogynist</key>
+        <string>misogynist</string>
+        <key>mysogyny</key>
+        <string>misogyny</string>
+        <key>mysterous</key>
+        <string>mysterious</string>
+        <key>naieve</key>
+        <string>naive</string>
+        <key>naturaly</key>
+        <string>naturally</string>
+        <key>naturely</key>
+        <string>naturally</string>
+        <key>naturual</key>
+        <string>natural</string>
+        <key>naturually</key>
+        <string>naturally</string>
+        <key>neccesarily</key>
+        <string>necessarily</string>
+        <key>neccesary</key>
+        <string>necessary</string>
+        <key>neccessarily</key>
+        <string>necessarily</string>
+        <key>neccessary</key>
+        <string>necessary</string>
+        <key>neccessities</key>
+        <string>necessities</string>
+        <key>necesarily</key>
+        <string>necessarily</string>
+        <key>necesary</key>
+        <string>necessary</string>
+        <key>necessiate</key>
+        <string>necessitate</string>
+        <key>neglible</key>
+        <string>negligible</string>
+        <key>negligable</key>
+        <string>negligible</string>
+        <key>negociate</key>
+        <string>negotiate</string>
+        <key>negociation</key>
+        <string>negotiation</string>
+        <key>negociations</key>
+        <string>negotiations</string>
+        <key>negotation</key>
+        <string>negotiation</string>
+        <key>neice</key>
+        <string>niece</string>
+        <key>neigborhood</key>
+        <string>neighborhood</string>
+        <key>neigbour</key>
+        <string>neighbour</string>
+        <key>neigbourhood</key>
+        <string>neighbourhood</string>
+        <key>neolitic</key>
+        <string>neolithic</string>
+        <key>nessasarily</key>
+        <string>necessarily</string>
+        <key>nessecary</key>
+        <string>necessary</string>
+        <key>nestin</key>
+        <string>nesting</string>
+        <key>neverthless</key>
+        <string>nevertheless</string>
+        <key>newletters</key>
+        <string>newsletters</string>
+        <key>nickle</key>
+        <string>nickel</string>
+        <key>nightfa;;</key>
+        <string>nightfall</string>
+        <key>nightime</key>
+        <string>nighttime</string>
+        <key>nineth</key>
+        <string>ninth</string>
+        <key>ninteenth</key>
+        <string>nineteenth</string>
+        <key>ninties</key>
+        <string>1990s</string>
+        <key>ninty</key>
+        <string>ninety</string>
+        <key>nkow</key>
+        <string>know</string>
+        <key>nkwo</key>
+        <string>know</string>
+        <key>nmae</key>
+        <string>name</string>
+        <key>noncombatents</key>
+        <string>noncombatants</string>
+        <key>nonsence</key>
+        <string>nonsense</string>
+        <key>nontheless</key>
+        <string>nonetheless</string>
+        <key>noone</key>
+        <string>no one</string>
+        <key>norhern</key>
+        <string>northern</string>
+        <key>northen</key>
+        <string>northern</string>
+        <key>northereastern</key>
+        <string>northeastern</string>
+        <key>notabley</key>
+        <string>notably</string>
+        <key>noteable</key>
+        <string>notable</string>
+        <key>noteably</key>
+        <string>notably</string>
+        <key>noteriety</key>
+        <string>notoriety</string>
+        <key>noth</key>
+        <string>north</string>
+        <key>nothern</key>
+        <string>northern</string>
+        <key>noticable</key>
+        <string>noticeable</string>
+        <key>noticably</key>
+        <string>noticeably</string>
+        <key>noticeing</key>
+        <string>noticing</string>
+        <key>noticible</key>
+        <string>noticeable</string>
+        <key>notwhithstanding</key>
+        <string>notwithstanding</string>
+        <key>noveau</key>
+        <string>nouveau</string>
+        <key>nowdays</key>
+        <string>nowadays</string>
+        <key>nowe</key>
+        <string>now</string>
+        <key>nto</key>
+        <string>not</string>
+        <key>nucular</key>
+        <string>nuclear</string>
+        <key>nuculear</key>
+        <string>nuclear</string>
+        <key>nuisanse</key>
+        <string>nuisance</string>
+        <key>numberous</key>
+        <string>numerous</string>
+        <key>nusance</key>
+        <string>nuisance</string>
+        <key>nutritent</key>
+        <string>nutrient</string>
+        <key>nutritents</key>
+        <string>nutrients</string>
+        <key>nuturing</key>
+        <string>nurturing</string>
+        <key>obediance</key>
+        <string>obedience</string>
+        <key>obediant</key>
+        <string>obedient</string>
+        <key>obession</key>
+        <string>obsession</string>
+        <key>obssessed</key>
+        <string>obsessed</string>
+        <key>obstacal</key>
+        <string>obstacle</string>
+        <key>obstancles</key>
+        <string>obstacles</string>
+        <key>obstruced</key>
+        <string>obstructed</string>
+        <key>ocasion</key>
+        <string>occasion</string>
+        <key>ocasional</key>
+        <string>occasional</string>
+        <key>ocasionally</key>
+        <string>occasionally</string>
+        <key>ocasionaly</key>
+        <string>occasionally</string>
+        <key>ocasioned</key>
+        <string>occasioned</string>
+        <key>ocasions</key>
+        <string>occasions</string>
+        <key>ocassion</key>
+        <string>occasion</string>
+        <key>ocassional</key>
+        <string>occasional</string>
+        <key>ocassionally</key>
+        <string>occasionally</string>
+        <key>ocassionaly</key>
+        <string>occasionally</string>
+        <key>ocassioned</key>
+        <string>occasioned</string>
+        <key>ocassions</key>
+        <string>occasions</string>
+        <key>occaison</key>
+        <string>occasion</string>
+        <key>occassion</key>
+        <string>occasion</string>
+        <key>occassional</key>
+        <string>occasional</string>
+        <key>occassionally</key>
+        <string>occasionally</string>
+        <key>occassionaly</key>
+        <string>occasionally</string>
+        <key>occassioned</key>
+        <string>occasioned</string>
+        <key>occassions</key>
+        <string>occasions</string>
+        <key>occationally</key>
+        <string>occasionally</string>
+        <key>occour</key>
+        <string>occur</string>
+        <key>occurance</key>
+        <string>occurrence</string>
+        <key>occurances</key>
+        <string>occurrences</string>
+        <key>occured</key>
+        <string>occurred</string>
+        <key>occurence</key>
+        <string>occurrence</string>
+        <key>occurences</key>
+        <string>occurrences</string>
+        <key>occuring</key>
+        <string>occurring</string>
+        <key>occurr</key>
+        <string>occur</string>
+        <key>occurrance</key>
+        <string>occurrence</string>
+        <key>occurrances</key>
+        <string>occurrences</string>
+        <key>octohedra</key>
+        <string>octahedra</string>
+        <key>octohedral</key>
+        <string>octahedral</string>
+        <key>octohedron</key>
+        <string>octahedron</string>
+        <key>ocuntries</key>
+        <string>countries</string>
+        <key>ocuntry</key>
+        <string>country</string>
+        <key>ocurr</key>
+        <string>occur</string>
+        <key>ocurrance</key>
+        <string>occurrence</string>
+        <key>ocurred</key>
+        <string>occurred</string>
+        <key>ocurrence</key>
+        <string>occurrence</string>
+        <key>offcers</key>
+        <string>officers</string>
+        <key>offcially</key>
+        <string>officially</string>
+        <key>offereings</key>
+        <string>offerings</string>
+        <key>offical</key>
+        <string>official</string>
+        <key>offically</key>
+        <string>officially</string>
+        <key>officals</key>
+        <string>officials</string>
+        <key>officaly</key>
+        <string>officially</string>
+        <key>officialy</key>
+        <string>officially</string>
+        <key>offred</key>
+        <string>offered</string>
+        <key>oftenly</key>
+        <string>often</string>
+        <key>oging</key>
+        <string>going</string>
+        <key>omision</key>
+        <string>omission</string>
+        <key>omited</key>
+        <string>omitted</string>
+        <key>omiting</key>
+        <string>omitting</string>
+        <key>omlette</key>
+        <string>omelette</string>
+        <key>ommision</key>
+        <string>omission</string>
+        <key>ommited</key>
+        <string>omitted</string>
+        <key>ommiting</key>
+        <string>omitting</string>
+        <key>ommitted</key>
+        <string>omitted</string>
+        <key>ommitting</key>
+        <string>omitting</string>
+        <key>omniverous</key>
+        <string>omnivorous</string>
+        <key>omniverously</key>
+        <string>omnivorously</string>
+        <key>omre</key>
+        <string>more</string>
+        <key>onot</key>
+        <string>note</string>
+        <key>onxy</key>
+        <string>onyx</string>
+        <key>onyl</key>
+        <string>only</string>
+        <key>openess</key>
+        <string>openness</string>
+        <key>oponent</key>
+        <string>opponent</string>
+        <key>oportunity</key>
+        <string>opportunity</string>
+        <key>opose</key>
+        <string>oppose</string>
+        <key>oposite</key>
+        <string>opposite</string>
+        <key>oposition</key>
+        <string>opposition</string>
+        <key>oppenly</key>
+        <string>openly</string>
+        <key>oppinion</key>
+        <string>opinion</string>
+        <key>opponant</key>
+        <string>opponent</string>
+        <key>oppononent</key>
+        <string>opponent</string>
+        <key>oppositition</key>
+        <string>opposition</string>
+        <key>oppossed</key>
+        <string>opposed</string>
+        <key>opprotunity</key>
+        <string>opportunity</string>
+        <key>opression</key>
+        <string>oppression</string>
+        <key>opressive</key>
+        <string>oppressive</string>
+        <key>opthalmic</key>
+        <string>ophthalmic</string>
+        <key>opthalmologist</key>
+        <string>ophthalmologist</string>
+        <key>opthalmology</key>
+        <string>ophthalmology</string>
+        <key>opthamologist</key>
+        <string>ophthalmologist</string>
+        <key>optmizations</key>
+        <string>optimizations</string>
+        <key>optomism</key>
+        <string>optimism</string>
+        <key>orded</key>
+        <string>ordered</string>
+        <key>organim</key>
+        <string>organism</string>
+        <key>organistion</key>
+        <string>organisation</string>
+        <key>organiztion</key>
+        <string>organization</string>
+        <key>orgin</key>
+        <string>origin</string>
+        <key>orginal</key>
+        <string>original</string>
+        <key>orginally</key>
+        <string>originally</string>
+        <key>orginize</key>
+        <string>organise</string>
+        <key>oridinarily</key>
+        <string>ordinarily</string>
+        <key>origanaly</key>
+        <string>originally</string>
+        <key>originall</key>
+        <string>original</string>
+        <key>originaly</key>
+        <string>originally</string>
+        <key>originially</key>
+        <string>originally</string>
+        <key>originnally</key>
+        <string>originally</string>
+        <key>origional</key>
+        <string>original</string>
+        <key>orignally</key>
+        <string>originally</string>
+        <key>orignially</key>
+        <string>originally</string>
+        <key>otehr</key>
+        <string>other</string>
+        <key>oublisher</key>
+        <string>publisher</string>
+        <key>ouevre</key>
+        <string>oeuvre</string>
+        <key>oustanding</key>
+        <string>outstanding</string>
+        <key>overshaddowed</key>
+        <string>overshadowed</string>
+        <key>overthere</key>
+        <string>over there</string>
+        <key>overwelming</key>
+        <string>overwhelming</string>
+        <key>overwheliming</key>
+        <string>overwhelming</string>
+        <key>owrk</key>
+        <string>work</string>
+        <key>owudl</key>
+        <string>would</string>
+        <key>oxigen</key>
+        <string>oxygen</string>
+        <key>oximoron</key>
+        <string>oxymoron</string>
+        <key>p0enis</key>
+        <string>penis</string>
+        <key>paide</key>
+        <string>paid</string>
+        <key>paitience</key>
+        <string>patience</string>
+        <key>palce</key>
+        <string>place</string>
+        <key>paleolitic</key>
+        <string>paleolithic</string>
+        <key>paliamentarian</key>
+        <string>parliamentarian</string>
+        <key>pallete</key>
+        <string>palette</string>
+        <key>pamflet</key>
+        <string>pamphlet</string>
+        <key>pamplet</key>
+        <string>pamphlet</string>
+        <key>pantomine</key>
+        <string>pantomime</string>
+        <key>paralel</key>
+        <string>parallel</string>
+        <key>paralell</key>
+        <string>parallel</string>
+        <key>paralelly</key>
+        <string>parallelly</string>
+        <key>paralely</key>
+        <string>parallelly</string>
+        <key>parallely</key>
+        <string>parallelly</string>
+        <key>paranthesis</key>
+        <string>parenthesis</string>
+        <key>paraphenalia</key>
+        <string>paraphernalia</string>
+        <key>parellels</key>
+        <string>parallels</string>
+        <key>parituclar</key>
+        <string>particular</string>
+        <key>parliment</key>
+        <string>parliament</string>
+        <key>parrakeets</key>
+        <string>parakeets</string>
+        <key>parralel</key>
+        <string>parallel</string>
+        <key>parrallel</key>
+        <string>parallel</string>
+        <key>parrallell</key>
+        <string>parallel</string>
+        <key>parrallelly</key>
+        <string>parallelly</string>
+        <key>parrallely</key>
+        <string>parallelly</string>
+        <key>partialy</key>
+        <string>partially</string>
+        <key>particually</key>
+        <string>particularly</string>
+        <key>particualr</key>
+        <string>particular</string>
+        <key>particuarly</key>
+        <string>particularly</string>
+        <key>particularily</key>
+        <string>particularly</string>
+        <key>particulary</key>
+        <string>particularly</string>
+        <key>pary</key>
+        <string>party</string>
+        <key>pased</key>
+        <string>passed</string>
+        <key>pasengers</key>
+        <string>passengers</string>
+        <key>passerbys</key>
+        <string>passersby</string>
+        <key>pasttime</key>
+        <string>pastime</string>
+        <key>pastural</key>
+        <string>pastoral</string>
+        <key>paticular</key>
+        <string>particular</string>
+        <key>pattented</key>
+        <string>patented</string>
+        <key>pavillion</key>
+        <string>pavilion</string>
+        <key>payed</key>
+        <string>paid</string>
+        <key>pblisher</key>
+        <string>publisher</string>
+        <key>pbulisher</key>
+        <string>publisher</string>
+        <key>peacefuland</key>
+        <string>peaceful and</string>
+        <key>peageant</key>
+        <string>pageant</string>
+        <key>peculure</key>
+        <string>peculiar</string>
+        <key>pedestrain</key>
+        <string>pedestrian</string>
+        <key>peformed</key>
+        <string>performed</string>
+        <key>peice</key>
+        <string>piece</string>
+        <key>penatly</key>
+        <string>penalty</string>
+        <key>penerator</key>
+        <string>penetrator</string>
+        <key>penisula</key>
+        <string>peninsula</string>
+        <key>penisular</key>
+        <string>peninsular</string>
+        <key>penninsula</key>
+        <string>peninsula</string>
+        <key>penninsular</key>
+        <string>peninsular</string>
+        <key>pennisula</key>
+        <string>peninsula</string>
+        <key>pensinula</key>
+        <string>peninsula</string>
+        <key>peom</key>
+        <string>poem</string>
+        <key>peoms</key>
+        <string>poems</string>
+        <key>peopel</key>
+        <string>people</string>
+        <key>peotry</key>
+        <string>poetry</string>
+        <key>perade</key>
+        <string>parade</string>
+        <key>percepted</key>
+        <string>perceived</string>
+        <key>percieve</key>
+        <string>perceive</string>
+        <key>percieved</key>
+        <string>perceived</string>
+        <key>perenially</key>
+        <string>perennially</string>
+        <key>perfomance</key>
+        <string>performance</string>
+        <key>perfomers</key>
+        <string>performers</string>
+        <key>performence</key>
+        <string>performance</string>
+        <key>performes</key>
+        <string>performed</string>
+        <key>perhasp</key>
+        <string>perhaps</string>
+        <key>perheaps</key>
+        <string>perhaps</string>
+        <key>perhpas</key>
+        <string>perhaps</string>
+        <key>peripathetic</key>
+        <string>peripatetic</string>
+        <key>peristent</key>
+        <string>persistent</string>
+        <key>perjery</key>
+        <string>perjury</string>
+        <key>perjorative</key>
+        <string>pejorative</string>
+        <key>permanant</key>
+        <string>permanent</string>
+        <key>permenant</key>
+        <string>permanent</string>
+        <key>permenantly</key>
+        <string>permanently</string>
+        <key>permissable</key>
+        <string>permissible</string>
+        <key>perogative</key>
+        <string>prerogative</string>
+        <key>peronal</key>
+        <string>personal</string>
+        <key>perosnality</key>
+        <string>personality</string>
+        <key>perphas</key>
+        <string>perhaps</string>
+        <key>perpindicular</key>
+        <string>perpendicular</string>
+        <key>perseverence</key>
+        <string>perseverance</string>
+        <key>persistance</key>
+        <string>persistence</string>
+        <key>persistant</key>
+        <string>persistent</string>
+        <key>personel</key>
+        <string>personnel</string>
+        <key>personell</key>
+        <string>personnel</string>
+        <key>personnell</key>
+        <string>personnel</string>
+        <key>persuded</key>
+        <string>persuaded</string>
+        <key>persue</key>
+        <string>pursue</string>
+        <key>persued</key>
+        <string>pursued</string>
+        <key>persuing</key>
+        <string>pursuing</string>
+        <key>persuit</key>
+        <string>pursuit</string>
+        <key>persuits</key>
+        <string>pursuits</string>
+        <key>pertubation</key>
+        <string>perturbation</string>
+        <key>pertubations</key>
+        <string>perturbations</string>
+        <key>pessiary</key>
+        <string>pessary</string>
+        <key>petetion</key>
+        <string>petition</string>
+        <key>phenomenom</key>
+        <string>phenomenon</string>
+        <key>phenomenonal</key>
+        <string>phenomenal</string>
+        <key>phenomenonly</key>
+        <string>phenomenally</string>
+        <key>phenomonenon</key>
+        <string>phenomenon</string>
+        <key>phenomonon</key>
+        <string>phenomenon</string>
+        <key>phenonmena</key>
+        <string>phenomena</string>
+        <key>philisopher</key>
+        <string>philosopher</string>
+        <key>philisophical</key>
+        <string>philosophical</string>
+        <key>philisophy</key>
+        <string>philosophy</string>
+        <key>phillosophically</key>
+        <string>philosophically</string>
+        <key>philospher</key>
+        <string>philosopher</string>
+        <key>philosphies</key>
+        <string>philosophies</string>
+        <key>philosphy</key>
+        <string>philosophy</string>
+        <key>phongraph</key>
+        <string>phonograph</string>
+        <key>phylosophical</key>
+        <string>philosophical</string>
+        <key>physicaly</key>
+        <string>physically</string>
+        <key>piblisher</key>
+        <string>publisher</string>
+        <key>pich</key>
+        <string>pitch</string>
+        <key>pilgrimmage</key>
+        <string>pilgrimage</string>
+        <key>pilgrimmages</key>
+        <string>pilgrimages</string>
+        <key>pinapple</key>
+        <string>pineapple</string>
+        <key>pinnaple</key>
+        <string>pineapple</string>
+        <key>pinoneered</key>
+        <string>pioneered</string>
+        <key>plagarism</key>
+        <string>plagiarism</string>
+        <key>planation</key>
+        <string>plantation</string>
+        <key>planed</key>
+        <string>planned</string>
+        <key>plantiff</key>
+        <string>plaintiff</string>
+        <key>plateu</key>
+        <string>plateau</string>
+        <key>plausable</key>
+        <string>plausible</string>
+        <key>playright</key>
+        <string>playwright</string>
+        <key>playwrite</key>
+        <string>playwright</string>
+        <key>playwrites</key>
+        <string>playwrights</string>
+        <key>pleasent</key>
+        <string>pleasant</string>
+        <key>plebicite</key>
+        <string>plebiscite</string>
+        <key>plesant</key>
+        <string>pleasant</string>
+        <key>poenis</key>
+        <string>penis</string>
+        <key>poeoples</key>
+        <string>peoples</string>
+        <key>poety</key>
+        <string>poetry</string>
+        <key>poisin</key>
+        <string>poison</string>
+        <key>polical</key>
+        <string>political</string>
+        <key>polinator</key>
+        <string>pollinator</string>
+        <key>polinators</key>
+        <string>pollinators</string>
+        <key>politican</key>
+        <string>politician</string>
+        <key>politicans</key>
+        <string>politicians</string>
+        <key>poltical</key>
+        <string>political</string>
+        <key>polute</key>
+        <string>pollute</string>
+        <key>poluted</key>
+        <string>polluted</string>
+        <key>polutes</key>
+        <string>pollutes</string>
+        <key>poluting</key>
+        <string>polluting</string>
+        <key>polution</key>
+        <string>pollution</string>
+        <key>polyphonyic</key>
+        <string>polyphonic</string>
+        <key>polysaccaride</key>
+        <string>polysaccharide</string>
+        <key>polysaccharid</key>
+        <string>polysaccharide</string>
+        <key>pomegranite</key>
+        <string>pomegranate</string>
+        <key>pomotion</key>
+        <string>promotion</string>
+        <key>poportional</key>
+        <string>proportional</string>
+        <key>popoulation</key>
+        <string>population</string>
+        <key>popularaty</key>
+        <string>popularity</string>
+        <key>populare</key>
+        <string>popular</string>
+        <key>populer</key>
+        <string>popular</string>
+        <key>portait</key>
+        <string>portrait</string>
+        <key>portayed</key>
+        <string>portrayed</string>
+        <key>portraing</key>
+        <string>portraying</string>
+        <key>portuguease</key>
+        <string>portuguese</string>
+        <key>portugues</key>
+        <string>Portuguese</string>
+        <key>posess</key>
+        <string>possess</string>
+        <key>posessed</key>
+        <string>possessed</string>
+        <key>posesses</key>
+        <string>possesses</string>
+        <key>posessing</key>
+        <string>possessing</string>
+        <key>posession</key>
+        <string>possession</string>
+        <key>posessions</key>
+        <string>possessions</string>
+        <key>posion</key>
+        <string>poison</string>
+        <key>positon</key>
+        <string>position</string>
+        <key>possable</key>
+        <string>possible</string>
+        <key>possably</key>
+        <string>possibly</string>
+        <key>posseses</key>
+        <string>possesses</string>
+        <key>possesing</key>
+        <string>possessing</string>
+        <key>possesion</key>
+        <string>possession</string>
+        <key>possessess</key>
+        <string>possesses</string>
+        <key>possibile</key>
+        <string>possible</string>
+        <key>possibilty</key>
+        <string>possibility</string>
+        <key>possiblility</key>
+        <string>possibility</string>
+        <key>possiblilty</key>
+        <string>possibility</string>
+        <key>possiblities</key>
+        <string>possibilities</string>
+        <key>possiblity</key>
+        <string>possibility</string>
+        <key>possition</key>
+        <string>position</string>
+        <key>posthomous</key>
+        <string>posthumous</string>
+        <key>postion</key>
+        <string>position</string>
+        <key>postive</key>
+        <string>positive</string>
+        <key>potatos</key>
+        <string>potatoes</string>
+        <key>potrait</key>
+        <string>portrait</string>
+        <key>potrayed</key>
+        <string>portrayed</string>
+        <key>poulations</key>
+        <string>populations</string>
+        <key>poverful</key>
+        <string>powerful</string>
+        <key>poweful</key>
+        <string>powerful</string>
+        <key>powerfull</key>
+        <string>powerful</string>
+        <key>ppublisher</key>
+        <string>publisher</string>
+        <key>practial</key>
+        <string>practical</string>
+        <key>practially</key>
+        <string>practically</string>
+        <key>practicaly</key>
+        <string>practically</string>
+        <key>practicioner</key>
+        <string>practitioner</string>
+        <key>practicioners</key>
+        <string>practitioners</string>
+        <key>practicly</key>
+        <string>practically</string>
+        <key>practioner</key>
+        <string>practitioner</string>
+        <key>practioners</key>
+        <string>practitioners</string>
+        <key>prairy</key>
+        <string>prairie</string>
+        <key>prarie</key>
+        <string>prairie</string>
+        <key>praries</key>
+        <string>prairies</string>
+        <key>pratice</key>
+        <string>practice</string>
+        <key>preample</key>
+        <string>preamble</string>
+        <key>precedessor</key>
+        <string>predecessor</string>
+        <key>preceed</key>
+        <string>precede</string>
+        <key>preceeded</key>
+        <string>preceded</string>
+        <key>preceeding</key>
+        <string>preceding</string>
+        <key>preceeds</key>
+        <string>precedes</string>
+        <key>precentage</key>
+        <string>percentage</string>
+        <key>precice</key>
+        <string>precise</string>
+        <key>precisly</key>
+        <string>precisely</string>
+        <key>precurser</key>
+        <string>precursor</string>
+        <key>predecesors</key>
+        <string>predecessors</string>
+        <key>predicatble</key>
+        <string>predictable</string>
+        <key>predicitons</key>
+        <string>predictions</string>
+        <key>predomiantly</key>
+        <string>predominately</string>
+        <key>prefered</key>
+        <string>preferred</string>
+        <key>prefering</key>
+        <string>preferring</string>
+        <key>preferrably</key>
+        <string>preferably</string>
+        <key>pregancies</key>
+        <string>pregnancies</string>
+        <key>preiod</key>
+        <string>period</string>
+        <key>preliferation</key>
+        <string>proliferation</string>
+        <key>premeire</key>
+        <string>premiere</string>
+        <key>premeired</key>
+        <string>premiered</string>
+        <key>premillenial</key>
+        <string>premillennial</string>
+        <key>preminence</key>
+        <string>preeminence</string>
+        <key>premission</key>
+        <string>permission</string>
+        <key>preocupation</key>
+        <string>preoccupation</string>
+        <key>prepair</key>
+        <string>prepare</string>
+        <key>prepartion</key>
+        <string>preparation</string>
+        <key>prepatory</key>
+        <string>preparatory</string>
+        <key>preperation</key>
+        <string>preparation</string>
+        <key>preperations</key>
+        <string>preparations</string>
+        <key>preriod</key>
+        <string>period</string>
+        <key>presedential</key>
+        <string>presidential</string>
+        <key>presense</key>
+        <string>presence</string>
+        <key>presidenital</key>
+        <string>presidential</string>
+        <key>presidental</key>
+        <string>presidential</string>
+        <key>presitgious</key>
+        <string>prestigious</string>
+        <key>prespective</key>
+        <string>perspective</string>
+        <key>prestigeous</key>
+        <string>prestigious</string>
+        <key>prestigous</key>
+        <string>prestigious</string>
+        <key>presumabely</key>
+        <string>presumably</string>
+        <key>presumibly</key>
+        <string>presumably</string>
+        <key>pretection</key>
+        <string>protection</string>
+        <key>prevelant</key>
+        <string>prevalent</string>
+        <key>preverse</key>
+        <string>perverse</string>
+        <key>previvous</key>
+        <string>previous</string>
+        <key>pricipal</key>
+        <string>principal</string>
+        <key>priciple</key>
+        <string>principle</string>
+        <key>priestood</key>
+        <string>priesthood</string>
+        <key>primarly</key>
+        <string>primarily</string>
+        <key>primative</key>
+        <string>primitive</string>
+        <key>primatively</key>
+        <string>primitively</string>
+        <key>primatives</key>
+        <string>primitives</string>
+        <key>primordal</key>
+        <string>primordial</string>
+        <key>priveledges</key>
+        <string>privileges</string>
+        <key>privelege</key>
+        <string>privilege</string>
+        <key>priveleged</key>
+        <string>privileged</string>
+        <key>priveleges</key>
+        <string>privileges</string>
+        <key>privelige</key>
+        <string>privilege</string>
+        <key>priveliged</key>
+        <string>privileged</string>
+        <key>priveliges</key>
+        <string>privileges</string>
+        <key>privelleges</key>
+        <string>privileges</string>
+        <key>privilage</key>
+        <string>privilege</string>
+        <key>priviledge</key>
+        <string>privilege</string>
+        <key>priviledges</key>
+        <string>privileges</string>
+        <key>privledge</key>
+        <string>privilege</string>
+        <key>privte</key>
+        <string>private</string>
+        <key>probabilaty</key>
+        <string>probability</string>
+        <key>probablistic</key>
+        <string>probabilistic</string>
+        <key>probablly</key>
+        <string>probably</string>
+        <key>probalibity</key>
+        <string>probability</string>
+        <key>probaly</key>
+        <string>probably</string>
+        <key>probelm</key>
+        <string>problem</string>
+        <key>proccess</key>
+        <string>process</string>
+        <key>proccessing</key>
+        <string>processing</string>
+        <key>procede</key>
+        <string>proceed</string>
+        <key>proceded</key>
+        <string>proceeded</string>
+        <key>procedes</key>
+        <string>proceeds</string>
+        <key>procedger</key>
+        <string>procedure</string>
+        <key>proceding</key>
+        <string>proceeding</string>
+        <key>procedings</key>
+        <string>proceedings</string>
+        <key>proceedure</key>
+        <string>procedure</string>
+        <key>proces</key>
+        <string>process</string>
+        <key>processer</key>
+        <string>processor</string>
+        <key>proclaimation</key>
+        <string>proclamation</string>
+        <key>proclamed</key>
+        <string>proclaimed</string>
+        <key>proclaming</key>
+        <string>proclaiming</string>
+        <key>proclomation</key>
+        <string>proclamation</string>
+        <key>profesion</key>
+        <string>profession</string>
+        <key>profesor</key>
+        <string>professor</string>
+        <key>professer</key>
+        <string>professor</string>
+        <key>proffesed</key>
+        <string>professed</string>
+        <key>proffesion</key>
+        <string>profession</string>
+        <key>proffesional</key>
+        <string>professional</string>
+        <key>proffesor</key>
+        <string>professor</string>
+        <key>profilic</key>
+        <string>prolific</string>
+        <key>progessed</key>
+        <string>progressed</string>
+        <key>programable</key>
+        <string>programmable</string>
+        <key>progrom</key>
+        <string>program</string>
+        <key>progroms</key>
+        <string>programs</string>
+        <key>prohabition</key>
+        <string>prohibition</string>
+        <key>prologomena</key>
+        <string>prolegomena</string>
+        <key>prominance</key>
+        <string>prominence</string>
+        <key>prominant</key>
+        <string>prominent</string>
+        <key>prominantly</key>
+        <string>prominently</string>
+        <key>prominately</key>
+        <string>prominently</string>
+        <key>promiscous</key>
+        <string>promiscuous</string>
+        <key>promotted</key>
+        <string>promoted</string>
+        <key>pronomial</key>
+        <string>pronominal</string>
+        <key>pronouced</key>
+        <string>pronounced</string>
+        <key>pronounched</key>
+        <string>pronounced</string>
+        <key>pronounciation</key>
+        <string>pronunciation</string>
+        <key>proove</key>
+        <string>prove</string>
+        <key>prooved</key>
+        <string>proved</string>
+        <key>prophacy</key>
+        <string>prophecy</string>
+        <key>propietary</key>
+        <string>proprietary</string>
+        <key>propmted</key>
+        <string>prompted</string>
+        <key>propoganda</key>
+        <string>propaganda</string>
+        <key>propogate</key>
+        <string>propagate</string>
+        <key>propogates</key>
+        <string>propagates</string>
+        <key>propogation</key>
+        <string>propagation</string>
+        <key>propostion</key>
+        <string>proposition</string>
+        <key>propotions</key>
+        <string>proportions</string>
+        <key>propper</key>
+        <string>proper</string>
+        <key>propperly</key>
+        <string>properly</string>
+        <key>proprietory</key>
+        <string>proprietary</string>
+        <key>proseletyzing</key>
+        <string>proselytizing</string>
+        <key>protaganist</key>
+        <string>protagonist</string>
+        <key>protaganists</key>
+        <string>protagonists</string>
+        <key>protocal</key>
+        <string>protocol</string>
+        <key>protoganist</key>
+        <string>protagonist</string>
+        <key>protrayed</key>
+        <string>portrayed</string>
+        <key>protruberance</key>
+        <string>protuberance</string>
+        <key>protruberances</key>
+        <string>protuberances</string>
+        <key>prouncements</key>
+        <string>pronouncements</string>
+        <key>provacative</key>
+        <string>provocative</string>
+        <key>provded</key>
+        <string>provided</string>
+        <key>provicial</key>
+        <string>provincial</string>
+        <key>provinicial</key>
+        <string>provincial</string>
+        <key>provisiosn</key>
+        <string>provision</string>
+        <key>provisonal</key>
+        <string>provisional</string>
+        <key>proximty</key>
+        <string>proximity</string>
+        <key>pseudononymous</key>
+        <string>pseudonymous</string>
+        <key>pseudonyn</key>
+        <string>pseudonym</string>
+        <key>psuedo</key>
+        <string>pseudo</string>
+        <key>psycology</key>
+        <string>psychology</string>
+        <key>psyhic</key>
+        <string>psychic</string>
+        <key>pubilsher</key>
+        <string>publisher</string>
+        <key>pubisher</key>
+        <string>publisher</string>
+        <key>publiaher</key>
+        <string>publisher</string>
+        <key>publically</key>
+        <string>publicly</string>
+        <key>publicaly</key>
+        <string>publicly</string>
+        <key>publicher</key>
+        <string>publisher</string>
+        <key>publihser</key>
+        <string>publisher</string>
+        <key>publisehr</key>
+        <string>publisher</string>
+        <key>publiser</key>
+        <string>publisher</string>
+        <key>publisger</key>
+        <string>publisher</string>
+        <key>publisheed</key>
+        <string>published</string>
+        <key>publisherr</key>
+        <string>publisher</string>
+        <key>publishher</key>
+        <string>publisher</string>
+        <key>publishor</key>
+        <string>publisher</string>
+        <key>publishre</key>
+        <string>publisher</string>
+        <key>publissher</key>
+        <string>publisher</string>
+        <key>publlisher</key>
+        <string>publisher</string>
+        <key>publsiher</key>
+        <string>publisher</string>
+        <key>publusher</key>
+        <string>publisher</string>
+        <key>puchasing</key>
+        <string>purchasing</string>
+        <key>pulisher</key>
+        <string>publisher</string>
+        <key>pumkin</key>
+        <string>pumpkin</string>
+        <key>puplisher</key>
+        <string>publisher</string>
+        <key>puritannical</key>
+        <string>puritanical</string>
+        <key>purposedly</key>
+        <string>purposely</string>
+        <key>purpotedly</key>
+        <string>purportedly</string>
+        <key>pursuade</key>
+        <string>persuade</string>
+        <key>pursuaded</key>
+        <string>persuaded</string>
+        <key>pursuades</key>
+        <string>persuades</string>
+        <key>pususading</key>
+        <string>persuading</string>
+        <key>puting</key>
+        <string>putting</string>
+        <key>pwoer</key>
+        <string>power</string>
+        <key>pyscic</key>
+        <string>psychic</string>
+        <key>qtuie</key>
+        <string>quiet</string>
+        <key>quantaty</key>
+        <string>quantity</string>
+        <key>quantitiy</key>
+        <string>quantity</string>
+        <key>quarantaine</key>
+        <string>quarantine</string>
+        <key>questonable</key>
+        <string>questionable</string>
+        <key>quicklyu</key>
+        <string>quickly</string>
+        <key>quinessential</key>
+        <string>quintessential</string>
+        <key>quitted</key>
+        <string>quit</string>
+        <key>quizes</key>
+        <string>quizzes</string>
+        <key>qutie</key>
+        <string>quiet</string>
+        <key>rabinnical</key>
+        <string>rabbinical</string>
+        <key>racaus</key>
+        <string>raucous</string>
+        <key>radiactive</key>
+        <string>radioactive</string>
+        <key>radify</key>
+        <string>ratify</string>
+        <key>raelly</key>
+        <string>really</string>
+        <key>rarified</key>
+        <string>rarefied</string>
+        <key>reaccurring</key>
+        <string>recurring</string>
+        <key>reacing</key>
+        <string>reaching</string>
+        <key>reacll</key>
+        <string>recall</string>
+        <key>readmition</key>
+        <string>readmission</string>
+        <key>realitvely</key>
+        <string>relatively</string>
+        <key>realsitic</key>
+        <string>realistic</string>
+        <key>realtions</key>
+        <string>relations</string>
+        <key>realy</key>
+        <string>really</string>
+        <key>realyl</key>
+        <string>really</string>
+        <key>reasearch</key>
+        <string>research</string>
+        <key>rebiulding</key>
+        <string>rebuilding</string>
+        <key>rebllions</key>
+        <string>rebellions</string>
+        <key>rebounce</key>
+        <string>rebound</string>
+        <key>reccomend</key>
+        <string>recommend</string>
+        <key>reccomendations</key>
+        <string>recommendations</string>
+        <key>reccomended</key>
+        <string>recommended</string>
+        <key>reccomending</key>
+        <string>recommending</string>
+        <key>reccommend</key>
+        <string>recommend</string>
+        <key>reccommended</key>
+        <string>recommended</string>
+        <key>reccommending</key>
+        <string>recommending</string>
+        <key>reccuring</key>
+        <string>recurring</string>
+        <key>receeded</key>
+        <string>receded</string>
+        <key>receeding</key>
+        <string>receding</string>
+        <key>receivedfrom</key>
+        <string>received from</string>
+        <key>recepient</key>
+        <string>recipient</string>
+        <key>recepients</key>
+        <string>recipients</string>
+        <key>receving</key>
+        <string>receiving</string>
+        <key>rechargable</key>
+        <string>rechargeable</string>
+        <key>reched</key>
+        <string>reached</string>
+        <key>recide</key>
+        <string>reside</string>
+        <key>recided</key>
+        <string>resided</string>
+        <key>recident</key>
+        <string>resident</string>
+        <key>recidents</key>
+        <string>residents</string>
+        <key>reciding</key>
+        <string>residing</string>
+        <key>reciepents</key>
+        <string>recipients</string>
+        <key>reciept</key>
+        <string>receipt</string>
+        <key>recieve</key>
+        <string>receive</string>
+        <key>recieved</key>
+        <string>received</string>
+        <key>reciever</key>
+        <string>receiver</string>
+        <key>recievers</key>
+        <string>receivers</string>
+        <key>recieves</key>
+        <string>receives</string>
+        <key>recieving</key>
+        <string>receiving</string>
+        <key>recipiant</key>
+        <string>recipient</string>
+        <key>recipiants</key>
+        <string>recipients</string>
+        <key>recived</key>
+        <string>received</string>
+        <key>recivership</key>
+        <string>receivership</string>
+        <key>recogise</key>
+        <string>recognise</string>
+        <key>recogize</key>
+        <string>recognize</string>
+        <key>recomend</key>
+        <string>recommend</string>
+        <key>recomended</key>
+        <string>recommended</string>
+        <key>recomending</key>
+        <string>recommending</string>
+        <key>recomends</key>
+        <string>recommends</string>
+        <key>recommedations</key>
+        <string>recommendations</string>
+        <key>reconaissance</key>
+        <string>reconnaissance</string>
+        <key>reconcilation</key>
+        <string>reconciliation</string>
+        <key>reconized</key>
+        <string>recognized</string>
+        <key>reconnaisance</key>
+        <string>reconnaissance</string>
+        <key>reconnaissence</key>
+        <string>reconnaissance</string>
+        <key>recontructed</key>
+        <string>reconstructed</string>
+        <key>recordproducer</key>
+        <string>record producer</string>
+        <key>recquired</key>
+        <string>required</string>
+        <key>recrational</key>
+        <string>recreational</string>
+        <key>recrod</key>
+        <string>record</string>
+        <key>recuiting</key>
+        <string>recruiting</string>
+        <key>recuring</key>
+        <string>recurring</string>
+        <key>recurrance</key>
+        <string>recurrence</string>
+        <key>rediculous</key>
+        <string>ridiculous</string>
+        <key>reedeming</key>
+        <string>redeeming</string>
+        <key>reenforced</key>
+        <string>reinforced</string>
+        <key>refect</key>
+        <string>reflect</string>
+        <key>refedendum</key>
+        <string>referendum</string>
+        <key>referal</key>
+        <string>referral</string>
+        <key>referece</key>
+        <string>reference</string>
+        <key>refereces</key>
+        <string>references</string>
+        <key>refered</key>
+        <string>referred</string>
+        <key>referemce</key>
+        <string>reference</string>
+        <key>referemces</key>
+        <string>references</string>
+        <key>referencs</key>
+        <string>references</string>
+        <key>referenece</key>
+        <string>reference</string>
+        <key>refereneced</key>
+        <string>referenced</string>
+        <key>refereneces</key>
+        <string>references</string>
+        <key>referiang</key>
+        <string>referring</string>
+        <key>refering</key>
+        <string>referring</string>
+        <key>refernce</key>
+        <string>references</string>
+        <key>refernces</key>
+        <string>references</string>
+        <key>referrence</key>
+        <string>reference</string>
+        <key>referrences</key>
+        <string>references</string>
+        <key>referrs</key>
+        <string>refers</string>
+        <key>reffered</key>
+        <string>referred</string>
+        <key>refference</key>
+        <string>reference</string>
+        <key>reffering</key>
+        <string>referring</string>
+        <key>refrence</key>
+        <string>reference</string>
+        <key>refrences</key>
+        <string>references</string>
+        <key>refrers</key>
+        <string>refers</string>
+        <key>refridgeration</key>
+        <string>refrigeration</string>
+        <key>refridgerator</key>
+        <string>refrigerator</string>
+        <key>refromist</key>
+        <string>reformist</string>
+        <key>refusla</key>
+        <string>refusal</string>
+        <key>regardes</key>
+        <string>regards</string>
+        <key>regluar</key>
+        <string>regular</string>
+        <key>reguarly</key>
+        <string>regularly</string>
+        <key>regulaion</key>
+        <string>regulation</string>
+        <key>regulaotrs</key>
+        <string>regulators</string>
+        <key>regularily</key>
+        <string>regularly</string>
+        <key>rehersal</key>
+        <string>rehearsal</string>
+        <key>reicarnation</key>
+        <string>reincarnation</string>
+        <key>reigining</key>
+        <string>reigning</string>
+        <key>reknown</key>
+        <string>renown</string>
+        <key>reknowned</key>
+        <string>renowned</string>
+        <key>rela</key>
+        <string>real</string>
+        <key>relaly</key>
+        <string>really</string>
+        <key>relatiopnship</key>
+        <string>relationship</string>
+        <key>relativly</key>
+        <string>relatively</string>
+        <key>relected</key>
+        <string>reelected</string>
+        <key>releive</key>
+        <string>relieve</string>
+        <key>releived</key>
+        <string>relieved</string>
+        <key>releiver</key>
+        <string>reliever</string>
+        <key>releses</key>
+        <string>releases</string>
+        <key>relevence</key>
+        <string>relevance</string>
+        <key>relevent</key>
+        <string>relevant</string>
+        <key>reliablity</key>
+        <string>reliability</string>
+        <key>relient</key>
+        <string>reliant</string>
+        <key>religeous</key>
+        <string>religious</string>
+        <key>religous</key>
+        <string>religious</string>
+        <key>religously</key>
+        <string>religiously</string>
+        <key>relinqushment</key>
+        <string>relinquishment</string>
+        <key>relitavely</key>
+        <string>relatively</string>
+        <key>relized</key>
+        <string>realized</string>
+        <key>relpacement</key>
+        <string>replacement</string>
+        <key>remaing</key>
+        <string>remaining</string>
+        <key>remeber</key>
+        <string>remember</string>
+        <key>rememberable</key>
+        <string>memorable</string>
+        <key>rememberance</key>
+        <string>remembrance</string>
+        <key>remembrence</key>
+        <string>remembrance</string>
+        <key>remenant</key>
+        <string>remnant</string>
+        <key>remenicent</key>
+        <string>reminiscent</string>
+        <key>reminent</key>
+        <string>remnant</string>
+        <key>reminescent</key>
+        <string>reminiscent</string>
+        <key>reminscent</key>
+        <string>reminiscent</string>
+        <key>reminsicent</key>
+        <string>reminiscent</string>
+        <key>rendevous</key>
+        <string>rendezvous</string>
+        <key>rendezous</key>
+        <string>rendezvous</string>
+        <key>renedered</key>
+        <string>rende</string>
+        <key>renewl</key>
+        <string>renewal</string>
+        <key>rennovate</key>
+        <string>renovate</string>
+        <key>rennovated</key>
+        <string>renovated</string>
+        <key>rennovating</key>
+        <string>renovating</string>
+        <key>rennovation</key>
+        <string>renovation</string>
+        <key>rentors</key>
+        <string>renters</string>
+        <key>reoccurrence</key>
+        <string>recurrence</string>
+        <key>reorganision</key>
+        <string>reorganisation</string>
+        <key>repatition</key>
+        <string>repetition</string>
+        <key>repectively</key>
+        <string>respectively</string>
+        <key>repeition</key>
+        <string>repetition</string>
+        <key>repentence</key>
+        <string>repentance</string>
+        <key>repentent</key>
+        <string>repentant</string>
+        <key>repeteadly</key>
+        <string>repeatedly</string>
+        <key>repetion</key>
+        <string>repetition</string>
+        <key>repid</key>
+        <string>rapid</string>
+        <key>reponse</key>
+        <string>response</string>
+        <key>reponsible</key>
+        <string>responsible</string>
+        <key>reportadly</key>
+        <string>reportedly</string>
+        <key>represantative</key>
+        <string>representative</string>
+        <key>representive</key>
+        <string>representative</string>
+        <key>representives</key>
+        <string>representatives</string>
+        <key>reproducable</key>
+        <string>reproducible</string>
+        <key>reprtoire</key>
+        <string>repertoire</string>
+        <key>repsectively</key>
+        <string>respectively</string>
+        <key>reptition</key>
+        <string>repetition</string>
+        <key>requirment</key>
+        <string>requirement</string>
+        <key>requred</key>
+        <string>required</string>
+        <key>resaurant</key>
+        <string>restaurant</string>
+        <key>resembelance</key>
+        <string>resemblance</string>
+        <key>resembes</key>
+        <string>resembles</string>
+        <key>resemblence</key>
+        <string>resemblance</string>
+        <key>resevoir</key>
+        <string>reservoir</string>
+        <key>residental</key>
+        <string>residential</string>
+        <key>resignement</key>
+        <string>resignment</string>
+        <key>resistable</key>
+        <string>resistible</string>
+        <key>resistence</key>
+        <string>resistance</string>
+        <key>resistent</key>
+        <string>resistant</string>
+        <key>respectivly</key>
+        <string>respectively</string>
+        <key>responce</key>
+        <string>response</string>
+        <key>responibilities</key>
+        <string>responsibilities</string>
+        <key>responisble</key>
+        <string>responsible</string>
+        <key>responnsibilty</key>
+        <string>responsibility</string>
+        <key>responsability</key>
+        <string>responsibility</string>
+        <key>responsibile</key>
+        <string>responsible</string>
+        <key>responsibilites</key>
+        <string>responsibilities</string>
+        <key>responsiblities</key>
+        <string>responsibilities</string>
+        <key>responsiblity</key>
+        <string>responsibility</string>
+        <key>ressemblance</key>
+        <string>resemblance</string>
+        <key>ressemble</key>
+        <string>resemble</string>
+        <key>ressembled</key>
+        <string>resembled</string>
+        <key>ressemblence</key>
+        <string>resemblance</string>
+        <key>ressembling</key>
+        <string>resembling</string>
+        <key>resssurecting</key>
+        <string>resurrecting</string>
+        <key>ressurect</key>
+        <string>resurrect</string>
+        <key>ressurected</key>
+        <string>resurrected</string>
+        <key>ressurection</key>
+        <string>resurrection</string>
+        <key>ressurrection</key>
+        <string>resurrection</string>
+        <key>restarant</key>
+        <string>restaurant</string>
+        <key>restarants</key>
+        <string>restaurants</string>
+        <key>restaraunt</key>
+        <string>restaurant</string>
+        <key>restaraunteur</key>
+        <string>restaurateur</string>
+        <key>restaraunteurs</key>
+        <string>restaurateurs</string>
+        <key>restaraunts</key>
+        <string>restaurants</string>
+        <key>restauranteurs</key>
+        <string>restaurateurs</string>
+        <key>restauration</key>
+        <string>restoration</string>
+        <key>restauraunt</key>
+        <string>restaurant</string>
+        <key>resteraunt</key>
+        <string>restaurant</string>
+        <key>resteraunts</key>
+        <string>restaurants</string>
+        <key>resticted</key>
+        <string>restricted</string>
+        <key>restraunt</key>
+        <string>restraint</string>
+        <key>resturant</key>
+        <string>restaurant</string>
+        <key>resturants</key>
+        <string>restaurants</string>
+        <key>resturaunt</key>
+        <string>restaurant</string>
+        <key>resturaunts</key>
+        <string>restaurants</string>
+        <key>resurecting</key>
+        <string>resurrecting</string>
+        <key>retalitated</key>
+        <string>retaliated</string>
+        <key>retalitation</key>
+        <string>retaliation</string>
+        <key>retreive</key>
+        <string>retrieve</string>
+        <key>returnd</key>
+        <string>returned</string>
+        <key>revaluated</key>
+        <string>reevaluated</string>
+        <key>reveiw</key>
+        <string>review</string>
+        <key>reveral</key>
+        <string>reversal</string>
+        <key>reversable</key>
+        <string>reversible</string>
+        <key>revolutionar</key>
+        <string>revolutionary</string>
+        <key>rewitten</key>
+        <string>rewritten</string>
+        <key>rewriet</key>
+        <string>rewrite</string>
+        <key>rference</key>
+        <string>reference</string>
+        <key>rferences</key>
+        <string>references</string>
+        <key>rhymme</key>
+        <string>rhyme</string>
+        <key>rhythem</key>
+        <string>rhythm</string>
+        <key>rhythim</key>
+        <string>rhythm</string>
+        <key>rhytmic</key>
+        <string>rhythmic</string>
+        <key>rigourous</key>
+        <string>rigorous</string>
+        <key>rininging</key>
+        <string>ringing</string>
+        <key>rised</key>
+        <string>rose</string>
+        <key>rococco</key>
+        <string>rococo</string>
+        <key>rocord</key>
+        <string>record</string>
+        <key>roomate</key>
+        <string>roommate</string>
+        <key>rougly</key>
+        <string>roughly</string>
+        <key>rucuperate</key>
+        <string>recuperate</string>
+        <key>rudimentatry</key>
+        <string>rudimentary</string>
+        <key>rulle</key>
+        <string>rule</string>
+        <key>runing</key>
+        <string>running</string>
+        <key>runnung</key>
+        <string>running</string>
+        <key>russina</key>
+        <string>Russian</string>
+        <key>rwite</key>
+        <string>write</string>
+        <key>rythem</key>
+        <string>rhythm</string>
+        <key>rythim</key>
+        <string>rhythm</string>
+        <key>rythm</key>
+        <string>rhythm</string>
+        <key>rythmic</key>
+        <string>rhythmic</string>
+        <key>rythyms</key>
+        <string>rhythms</string>
+        <key>sacrafice</key>
+        <string>sacrifice</string>
+        <key>sacreligious</key>
+        <string>sacrilegious</string>
+        <key>sacrifical</key>
+        <string>sacrificial</string>
+        <key>saftey</key>
+        <string>safety</string>
+        <key>safty</key>
+        <string>safety</string>
+        <key>salery</key>
+        <string>salary</string>
+        <key>sanctionning</key>
+        <string>sanctioning</string>
+        <key>sandwhich</key>
+        <string>sandwich</string>
+        <key>santioned</key>
+        <string>sanctioned</string>
+        <key>sargant</key>
+        <string>sergeant</string>
+        <key>sargeant</key>
+        <string>sergeant</string>
+        <key>satelite</key>
+        <string>satellite</string>
+        <key>satelites</key>
+        <string>satellites</string>
+        <key>satisfactority</key>
+        <string>satisfactorily</string>
+        <key>satric</key>
+        <string>satiric</string>
+        <key>satrical</key>
+        <string>satirical</string>
+        <key>satrically</key>
+        <string>satirically</string>
+        <key>sattelite</key>
+        <string>satellite</string>
+        <key>sattelites</key>
+        <string>satellites</string>
+        <key>saught</key>
+        <string>sought</string>
+        <key>saveing</key>
+        <string>saving</string>
+        <key>saxaphone</key>
+        <string>saxophone</string>
+        <key>scaleable</key>
+        <string>scalable</string>
+        <key>scandanavia</key>
+        <string>Scandinavia</string>
+        <key>scaricity</key>
+        <string>scarcity</string>
+        <key>scavanged</key>
+        <string>scavenged</string>
+        <key>schedual</key>
+        <string>schedule</string>
+        <key>scholarhip</key>
+        <string>scholarship</string>
+        <key>scholarstic</key>
+        <string>scholastic</string>
+        <key>scientfic</key>
+        <string>scientific</string>
+        <key>scientifc</key>
+        <string>scientific</string>
+        <key>scientis</key>
+        <string>scientist</string>
+        <key>scince</key>
+        <string>science</string>
+        <key>scinece</key>
+        <string>science</string>
+        <key>scirpt</key>
+        <string>script</string>
+        <key>scoll</key>
+        <string>scroll</string>
+        <key>screenwrighter</key>
+        <string>screenwriter</string>
+        <key>scrutinity</key>
+        <string>scrutiny</string>
+        <key>scuptures</key>
+        <string>sculptures</string>
+        <key>seach</key>
+        <string>search</string>
+        <key>seached</key>
+        <string>searched</string>
+        <key>seaches</key>
+        <string>searches</string>
+        <key>secratary</key>
+        <string>secretary</string>
+        <key>secretery</key>
+        <string>secretary</string>
+        <key>sedereal</key>
+        <string>sidereal</string>
+        <key>seeked</key>
+        <string>sought</string>
+        <key>segementation</key>
+        <string>segmentation</string>
+        <key>seguoys</key>
+        <string>segues</string>
+        <key>seige</key>
+        <string>siege</string>
+        <key>seing</key>
+        <string>seeing</string>
+        <key>seinor</key>
+        <string>senior</string>
+        <key>seldomly</key>
+        <string>seldom</string>
+        <key>senarios</key>
+        <string>scenarios</string>
+        <key>senstive</key>
+        <string>sensitive</string>
+        <key>sensure</key>
+        <string>censure</string>
+        <key>seperate</key>
+        <string>separate</string>
+        <key>seperated</key>
+        <string>separated</string>
+        <key>seperately</key>
+        <string>separately</string>
+        <key>seperates</key>
+        <string>separates</string>
+        <key>seperating</key>
+        <string>separating</string>
+        <key>seperation</key>
+        <string>separation</string>
+        <key>seperatism</key>
+        <string>separatism</string>
+        <key>seperatist</key>
+        <string>separatist</string>
+        <key>sepina</key>
+        <string>subpoena</string>
+        <key>sergent</key>
+        <string>sergeant</string>
+        <key>settelement</key>
+        <string>settlement</string>
+        <key>settlment</key>
+        <string>settlement</string>
+        <key>severeal</key>
+        <string>several</string>
+        <key>severley</key>
+        <string>severely</string>
+        <key>severly</key>
+        <string>severely</string>
+        <key>sevice</key>
+        <string>service</string>
+        <key>shadasloo</key>
+        <string>shadaloo</string>
+        <key>shaddow</key>
+        <string>shadow</string>
+        <key>shadoloo</key>
+        <string>shadaloo</string>
+        <key>shamen</key>
+        <string>shaman</string>
+        <key>sheat</key>
+        <string>sheath</string>
+        <key>sheild</key>
+        <string>shield</string>
+        <key>sherif</key>
+        <string>sheriff</string>
+        <key>shineing</key>
+        <string>shining</string>
+        <key>shiped</key>
+        <string>shipped</string>
+        <key>shiping</key>
+        <string>shipping</string>
+        <key>shopkeeepers</key>
+        <string>shopkeepers</string>
+        <key>shorly</key>
+        <string>shortly</string>
+        <key>shortwhile</key>
+        <string>short while</string>
+        <key>shoudl</key>
+        <string>should</string>
+        <key>shoudln</key>
+        <string>shouldn&apos;t</string>
+        <key>shouldnt</key>
+        <string>shouldn&apos;t</string>
+        <key>shreak</key>
+        <string>shriek</string>
+        <key>shrinked</key>
+        <string>shrunk</string>
+        <key>sicne</key>
+        <string>since</string>
+        <key>sideral</key>
+        <string>sidereal</string>
+        <key>siezure</key>
+        <string>seizure</string>
+        <key>siezures</key>
+        <string>seizures</string>
+        <key>siginificant</key>
+        <string>significant</string>
+        <key>signficant</key>
+        <string>significant</string>
+        <key>signficiant</key>
+        <string>significant</string>
+        <key>signfies</key>
+        <string>signifies</string>
+        <key>signifantly</key>
+        <string>significantly</string>
+        <key>significently</key>
+        <string>significantly</string>
+        <key>signifigant</key>
+        <string>significant</string>
+        <key>signifigantly</key>
+        <string>significantly</string>
+        <key>signitories</key>
+        <string>signatories</string>
+        <key>signitory</key>
+        <string>signatory</string>
+        <key>similarily</key>
+        <string>similarly</string>
+        <key>similiar</key>
+        <string>similar</string>
+        <key>similiarity</key>
+        <string>similarity</string>
+        <key>similiarly</key>
+        <string>similarly</string>
+        <key>simmilar</key>
+        <string>similar</string>
+        <key>simpley</key>
+        <string>simply</string>
+        <key>simplier</key>
+        <string>simpler</string>
+        <key>simultanous</key>
+        <string>simultaneous</string>
+        <key>simultanously</key>
+        <string>simultaneously</string>
+        <key>sincerley</key>
+        <string>sincerely</string>
+        <key>singsog</key>
+        <string>singsong</string>
+        <key>sinse</key>
+        <string>since</string>
+        <key>skateing</key>
+        <string>skating</string>
+        <key>slaugterhouses</key>
+        <string>slaughterhouses</string>
+        <key>slighly</key>
+        <string>slightly</string>
+        <key>slowy</key>
+        <string>slowly</string>
+        <key>smae</key>
+        <string>same</string>
+        <key>smealting</key>
+        <string>smelting</string>
+        <key>smoe</key>
+        <string>some</string>
+        <key>sneeks</key>
+        <string>sneaks</string>
+        <key>snese</key>
+        <string>sneeze</string>
+        <key>socalism</key>
+        <string>socialism</string>
+        <key>socities</key>
+        <string>societies</string>
+        <key>soem</key>
+        <string>some</string>
+        <key>sofware</key>
+        <string>software</string>
+        <key>sohw</key>
+        <string>show</string>
+        <key>soilders</key>
+        <string>soldiers</string>
+        <key>solatary</key>
+        <string>solitary</string>
+        <key>soley</key>
+        <string>solely</string>
+        <key>soliders</key>
+        <string>soldiers</string>
+        <key>soliliquy</key>
+        <string>soliloquy</string>
+        <key>soluable</key>
+        <string>soluble</string>
+        <key>somene</key>
+        <string>someone</string>
+        <key>somtimes</key>
+        <string>sometimes</string>
+        <key>somwhere</key>
+        <string>somewhere</string>
+        <key>sophicated</key>
+        <string>sophisticated</string>
+        <key>sophmore</key>
+        <string>sophomore</string>
+        <key>sorceror</key>
+        <string>sorcerer</string>
+        <key>sorrounding</key>
+        <string>surrounding</string>
+        <key>sotry</key>
+        <string>story</string>
+        <key>sotyr</key>
+        <string>story</string>
+        <key>soudn</key>
+        <string>sound</string>
+        <key>soudns</key>
+        <string>sounds</string>
+        <key>sould</key>
+        <string>could</string>
+        <key>sountrack</key>
+        <string>soundtrack</string>
+        <key>sourth</key>
+        <string>south</string>
+        <key>sourthern</key>
+        <string>southern</string>
+        <key>souvenier</key>
+        <string>souvenir</string>
+        <key>souveniers</key>
+        <string>souvenirs</string>
+        <key>soveits</key>
+        <string>soviets</string>
+        <key>sovereignity</key>
+        <string>sovereignty</string>
+        <key>soverign</key>
+        <string>sovereign</string>
+        <key>soverignity</key>
+        <string>sovereignty</string>
+        <key>soverignty</key>
+        <string>sovereignty</string>
+        <key>spainish</key>
+        <string>Spanish</string>
+        <key>speach</key>
+        <string>speech</string>
+        <key>specfic</key>
+        <string>specific</string>
+        <key>speciallized</key>
+        <string>specialized</string>
+        <key>specifiying</key>
+        <string>specifying</string>
+        <key>speciman</key>
+        <string>specimen</string>
+        <key>spectauclar</key>
+        <string>spectacular</string>
+        <key>spectaulars</key>
+        <string>spectaculars</string>
+        <key>spectum</key>
+        <string>spectrum</string>
+        <key>speices</key>
+        <string>species</string>
+        <key>spendour</key>
+        <string>splendour</string>
+        <key>spermatozoan</key>
+        <string>spermatozoon</string>
+        <key>spoace</key>
+        <string>space</string>
+        <key>sponser</key>
+        <string>sponsor</string>
+        <key>sponsered</key>
+        <string>sponsored</string>
+        <key>spontanous</key>
+        <string>spontaneous</string>
+        <key>sponzored</key>
+        <string>sponsored</string>
+        <key>spoonfulls</key>
+        <string>spoonfuls</string>
+        <key>sppeches</key>
+        <string>speeches</string>
+        <key>spreaded</key>
+        <string>spread</string>
+        <key>sprech</key>
+        <string>speech</string>
+        <key>spred</key>
+        <string>spread</string>
+        <key>spriritual</key>
+        <string>spiritual</string>
+        <key>spritual</key>
+        <string>spiritual</string>
+        <key>sqaure</key>
+        <string>square</string>
+        <key>stablility</key>
+        <string>stability</string>
+        <key>stainlees</key>
+        <string>stainless</string>
+        <key>staion</key>
+        <string>station</string>
+        <key>standars</key>
+        <string>standards</string>
+        <key>stange</key>
+        <string>strange</string>
+        <key>startegic</key>
+        <string>strategic</string>
+        <key>startegies</key>
+        <string>strategies</string>
+        <key>startegy</key>
+        <string>strategy</string>
+        <key>stateman</key>
+        <string>statesman</string>
+        <key>statememts</key>
+        <string>statements</string>
+        <key>statment</key>
+        <string>statement</string>
+        <key>steriods</key>
+        <string>steroids</string>
+        <key>sterotypes</key>
+        <string>stereotypes</string>
+        <key>stilus</key>
+        <string>stylus</string>
+        <key>stingent</key>
+        <string>stringent</string>
+        <key>stiring</key>
+        <string>stirring</string>
+        <key>stirrs</key>
+        <string>stirs</string>
+        <key>stlye</key>
+        <string>style</string>
+        <key>stomache</key>
+        <string>stomach</string>
+        <key>stong</key>
+        <string>strong</string>
+        <key>stopry</key>
+        <string>story</string>
+        <key>storeis</key>
+        <string>stories</string>
+        <key>storise</key>
+        <string>stories</string>
+        <key>stornegst</key>
+        <string>strongest</string>
+        <key>stoyr</key>
+        <string>story</string>
+        <key>stpo</key>
+        <string>stop</string>
+        <key>stradegies</key>
+        <string>strategies</string>
+        <key>stradegy</key>
+        <string>strategy</string>
+        <key>strat</key>
+        <string>start</string>
+        <key>stratagically</key>
+        <string>strategically</string>
+        <key>streemlining</key>
+        <string>streamlining</string>
+        <key>stregth</key>
+        <string>strength</string>
+        <key>strenghen</key>
+        <string>strengthen</string>
+        <key>strenghened</key>
+        <string>strengthened</string>
+        <key>strenghening</key>
+        <string>strengthening</string>
+        <key>strenght</key>
+        <string>strength</string>
+        <key>strenghten</key>
+        <string>strengthen</string>
+        <key>strenghtened</key>
+        <string>strengthened</string>
+        <key>strenghtening</key>
+        <string>strengthening</string>
+        <key>strengtened</key>
+        <string>strengthened</string>
+        <key>strenous</key>
+        <string>strenuous</string>
+        <key>strictist</key>
+        <string>strictest</string>
+        <key>strikely</key>
+        <string>strikingly</string>
+        <key>strnad</key>
+        <string>strand</string>
+        <key>stroy</key>
+        <string>story</string>
+        <key>structual</key>
+        <string>structural</string>
+        <key>stubborness</key>
+        <string>stubbornness</string>
+        <key>stucture</key>
+        <string>structure</string>
+        <key>stuctured</key>
+        <string>structured</string>
+        <key>studdy</key>
+        <string>study</string>
+        <key>studing</key>
+        <string>studying</string>
+        <key>stuggling</key>
+        <string>struggling</string>
+        <key>sturcture</key>
+        <string>structure</string>
+        <key>subcatagories</key>
+        <string>subcategories</string>
+        <key>subcatagory</key>
+        <string>subcategory</string>
+        <key>subconsiously</key>
+        <string>subconsciously</string>
+        <key>subjudgation</key>
+        <string>subjugation</string>
+        <key>submachne</key>
+        <string>submachine</string>
+        <key>subpecies</key>
+        <string>subspecies</string>
+        <key>subsidary</key>
+        <string>subsidiary</string>
+        <key>subsiduary</key>
+        <string>subsidiary</string>
+        <key>subsquent</key>
+        <string>subsequent</string>
+        <key>subsquently</key>
+        <string>subsequently</string>
+        <key>substace</key>
+        <string>substance</string>
+        <key>substancial</key>
+        <string>substantial</string>
+        <key>substatial</key>
+        <string>substantial</string>
+        <key>substituded</key>
+        <string>substituted</string>
+        <key>substract</key>
+        <string>subtract</string>
+        <key>substracted</key>
+        <string>subtracted</string>
+        <key>substracting</key>
+        <string>subtracting</string>
+        <key>substraction</key>
+        <string>subtraction</string>
+        <key>substracts</key>
+        <string>subtracts</string>
+        <key>subtances</key>
+        <string>substances</string>
+        <key>subterranian</key>
+        <string>subterranean</string>
+        <key>suburburban</key>
+        <string>suburban</string>
+        <key>succceeded</key>
+        <string>succeeded</string>
+        <key>succcesses</key>
+        <string>successes</string>
+        <key>succedded</key>
+        <string>succeeded</string>
+        <key>succeded</key>
+        <string>succeeded</string>
+        <key>succeds</key>
+        <string>succeeds</string>
+        <key>succesful</key>
+        <string>successful</string>
+        <key>succesfully</key>
+        <string>successfully</string>
+        <key>succesfuly</key>
+        <string>successfully</string>
+        <key>succesion</key>
+        <string>succession</string>
+        <key>succesive</key>
+        <string>successive</string>
+        <key>successfull</key>
+        <string>successful</string>
+        <key>successully</key>
+        <string>successfully</string>
+        <key>succsess</key>
+        <string>success</string>
+        <key>succsessfull</key>
+        <string>successful</string>
+        <key>suceed</key>
+        <string>succeed</string>
+        <key>suceeded</key>
+        <string>succeeded</string>
+        <key>suceeding</key>
+        <string>succeeding</string>
+        <key>suceeds</key>
+        <string>succeeds</string>
+        <key>sucesful</key>
+        <string>successful</string>
+        <key>sucesfully</key>
+        <string>successfully</string>
+        <key>sucesfuly</key>
+        <string>successfully</string>
+        <key>sucesion</key>
+        <string>succession</string>
+        <key>sucess</key>
+        <string>success</string>
+        <key>sucesses</key>
+        <string>successes</string>
+        <key>sucessful</key>
+        <string>successful</string>
+        <key>sucessfull</key>
+        <string>successful</string>
+        <key>sucessfully</key>
+        <string>successfully</string>
+        <key>sucessfuly</key>
+        <string>successfully</string>
+        <key>sucession</key>
+        <string>succession</string>
+        <key>sucessive</key>
+        <string>successive</string>
+        <key>sucessor</key>
+        <string>successor</string>
+        <key>sucessot</key>
+        <string>successor</string>
+        <key>sucide</key>
+        <string>suicide</string>
+        <key>sucidial</key>
+        <string>suicidal</string>
+        <key>sufferage</key>
+        <string>suffrage</string>
+        <key>sufferred</key>
+        <string>suffered</string>
+        <key>sufferring</key>
+        <string>suffering</string>
+        <key>sufficent</key>
+        <string>sufficient</string>
+        <key>sufficently</key>
+        <string>sufficiently</string>
+        <key>sumary</key>
+        <string>summary</string>
+        <key>sunglases</key>
+        <string>sunglasses</string>
+        <key>suop</key>
+        <string>soup</string>
+        <key>superceeded</key>
+        <string>superseded</string>
+        <key>superintendant</key>
+        <string>superintendent</string>
+        <key>suphisticated</key>
+        <string>sophisticated</string>
+        <key>suplimented</key>
+        <string>supplemented</string>
+        <key>supose</key>
+        <string>suppose</string>
+        <key>suposed</key>
+        <string>supposed</string>
+        <key>suposedly</key>
+        <string>supposedly</string>
+        <key>suposes</key>
+        <string>supposes</string>
+        <key>suposing</key>
+        <string>supposing</string>
+        <key>supplamented</key>
+        <string>supplemented</string>
+        <key>suppliementing</key>
+        <string>supplementing</string>
+        <key>suppoed</key>
+        <string>supposed</string>
+        <key>supposingly</key>
+        <string>supposedly</string>
+        <key>suppy</key>
+        <string>supply</string>
+        <key>supress</key>
+        <string>suppress</string>
+        <key>supressed</key>
+        <string>suppressed</string>
+        <key>supresses</key>
+        <string>suppresses</string>
+        <key>supressing</key>
+        <string>suppressing</string>
+        <key>suprise</key>
+        <string>surprise</string>
+        <key>suprised</key>
+        <string>surprised</string>
+        <key>suprising</key>
+        <string>surprising</string>
+        <key>suprisingly</key>
+        <string>surprisingly</string>
+        <key>suprize</key>
+        <string>surprise</string>
+        <key>suprized</key>
+        <string>surprised</string>
+        <key>suprizing</key>
+        <string>surprising</string>
+        <key>suprizingly</key>
+        <string>surprisingly</string>
+        <key>surfce</key>
+        <string>surface</string>
+        <key>surley</key>
+        <string>surely</string>
+        <key>suround</key>
+        <string>surround</string>
+        <key>surounded</key>
+        <string>surrounded</string>
+        <key>surounding</key>
+        <string>surrounding</string>
+        <key>suroundings</key>
+        <string>surroundings</string>
+        <key>surounds</key>
+        <string>surrounds</string>
+        <key>surplanted</key>
+        <string>supplanted</string>
+        <key>surpress</key>
+        <string>suppress</string>
+        <key>surpressed</key>
+        <string>suppressed</string>
+        <key>surprize</key>
+        <string>surprise</string>
+        <key>surprized</key>
+        <string>surprised</string>
+        <key>surprizing</key>
+        <string>surprising</string>
+        <key>surprizingly</key>
+        <string>surprisingly</string>
+        <key>surrended</key>
+        <string>surrendered</string>
+        <key>surrepetitious</key>
+        <string>surreptitious</string>
+        <key>surrepetitiously</key>
+        <string>surreptitiously</string>
+        <key>surreptious</key>
+        <string>surreptitious</string>
+        <key>surreptiously</key>
+        <string>surreptitiously</string>
+        <key>surronded</key>
+        <string>surrounded</string>
+        <key>surrouded</key>
+        <string>surrounded</string>
+        <key>surrouding</key>
+        <string>surrounding</string>
+        <key>surrundering</key>
+        <string>surrendering</string>
+        <key>surveilence</key>
+        <string>surveillance</string>
+        <key>surveill</key>
+        <string>surveil</string>
+        <key>surveyer</key>
+        <string>surveyor</string>
+        <key>surviver</key>
+        <string>survivor</string>
+        <key>survivers</key>
+        <string>survivors</string>
+        <key>survivied</key>
+        <string>survived</string>
+        <key>suseptable</key>
+        <string>susceptible</string>
+        <key>suseptible</key>
+        <string>susceptible</string>
+        <key>suspention</key>
+        <string>suspension</string>
+        <key>swaer</key>
+        <string>swear</string>
+        <key>swaers</key>
+        <string>swears</string>
+        <key>swepth</key>
+        <string>swept</string>
+        <key>swiming</key>
+        <string>swimming</string>
+        <key>syas</key>
+        <string>says</string>
+        <key>symetrical</key>
+        <string>symmetrical</string>
+        <key>symetrically</key>
+        <string>symmetrically</string>
+        <key>symetry</key>
+        <string>symmetry</string>
+        <key>symettric</key>
+        <string>symmetric</string>
+        <key>symmetral</key>
+        <string>symmetric</string>
+        <key>symmetricaly</key>
+        <string>symmetrically</string>
+        <key>synagouge</key>
+        <string>synagogue</string>
+        <key>syncronization</key>
+        <string>synchronization</string>
+        <key>synonomous</key>
+        <string>synonymous</string>
+        <key>synonymns</key>
+        <string>synonyms</string>
+        <key>synphony</key>
+        <string>symphony</string>
+        <key>syphyllis</key>
+        <string>syphilis</string>
+        <key>sypmtoms</key>
+        <string>symptoms</string>
+        <key>syrap</key>
+        <string>syrup</string>
+        <key>sysmatically</key>
+        <string>systematically</string>
+        <key>sytem</key>
+        <string>system</string>
+        <key>sytle</key>
+        <string>style</string>
+        <key>tabacco</key>
+        <string>tobacco</string>
+        <key>tahn</key>
+        <string>than</string>
+        <key>taht</key>
+        <string>that</string>
+        <key>talekd</key>
+        <string>talked</string>
+        <key>targetted</key>
+        <string>targeted</string>
+        <key>targetting</key>
+        <string>targeting</string>
+        <key>tast</key>
+        <string>taste</string>
+        <key>tath</key>
+        <string>that</string>
+        <key>tattooes</key>
+        <string>tattoos</string>
+        <key>taxanomic</key>
+        <string>taxonomic</string>
+        <key>taxanomy</key>
+        <string>taxonomy</string>
+        <key>teached</key>
+        <string>taught</string>
+        <key>techician</key>
+        <string>technician</string>
+        <key>techicians</key>
+        <string>technicians</string>
+        <key>techiniques</key>
+        <string>techniques</string>
+        <key>technitian</key>
+        <string>technician</string>
+        <key>technnology</key>
+        <string>technology</string>
+        <key>technolgy</key>
+        <string>technology</string>
+        <key>teh</key>
+        <string>the</string>
+        <key>tehy</key>
+        <string>they</string>
+        <key>telelevision</key>
+        <string>television</string>
+        <key>televsion</key>
+        <string>television</string>
+        <key>telphony</key>
+        <string>telephony</string>
+        <key>temerature</key>
+        <string>temperature</string>
+        <key>tempalte</key>
+        <string>template</string>
+        <key>tempaltes</key>
+        <string>templates</string>
+        <key>temparate</key>
+        <string>temperate</string>
+        <key>temperarily</key>
+        <string>temporarily</string>
+        <key>temperment</key>
+        <string>temperament</string>
+        <key>tempertaure</key>
+        <string>temperature</string>
+        <key>temperture</key>
+        <string>temperature</string>
+        <key>temprary</key>
+        <string>temporary</string>
+        <key>tenacle</key>
+        <string>tentacle</string>
+        <key>tenacles</key>
+        <string>tentacles</string>
+        <key>tendacy</key>
+        <string>tendency</string>
+        <key>tendancies</key>
+        <string>tendencies</string>
+        <key>tendancy</key>
+        <string>tendency</string>
+        <key>tennisplayer</key>
+        <string>tennis player</string>
+        <key>tepmorarily</key>
+        <string>temporarily</string>
+        <key>terrestial</key>
+        <string>terrestrial</string>
+        <key>terriories</key>
+        <string>territories</string>
+        <key>terriory</key>
+        <string>territory</string>
+        <key>territorist</key>
+        <string>terrorist</string>
+        <key>territoy</key>
+        <string>territory</string>
+        <key>terroist</key>
+        <string>terrorist</string>
+        <key>testiclular</key>
+        <string>testicular</string>
+        <key>tghe</key>
+        <string>the</string>
+        <key>thast</key>
+        <string>that&apos;s</string>
+        <key>theather</key>
+        <string>theater</string>
+        <key>theese</key>
+        <string>these</string>
+        <key>theif</key>
+        <string>thief</string>
+        <key>theives</key>
+        <string>thieves</string>
+        <key>themselfs</key>
+        <string>themselves</string>
+        <key>themslves</key>
+        <string>themselves</string>
+        <key>ther</key>
+        <string>there</string>
+        <key>therafter</key>
+        <string>thereafter</string>
+        <key>therby</key>
+        <string>thereby</string>
+        <key>theri</key>
+        <string>their</string>
+        <key>theyre</key>
+        <string>they&apos;re</string>
+        <key>thgat</key>
+        <string>that</string>
+        <key>thge</key>
+        <string>the</string>
+        <key>thier</key>
+        <string>their</string>
+        <key>thign</key>
+        <string>thing</string>
+        <key>thigns</key>
+        <string>things</string>
+        <key>thigsn</key>
+        <string>things</string>
+        <key>thikn</key>
+        <string>think</string>
+        <key>thikning</key>
+        <string>thinking</string>
+        <key>thikns</key>
+        <string>thinks</string>
+        <key>thiunk</key>
+        <string>think</string>
+        <key>thn</key>
+        <string>then</string>
+        <key>thna</key>
+        <string>than</string>
+        <key>thne</key>
+        <string>then</string>
+        <key>thnig</key>
+        <string>thing</string>
+        <key>thnigs</key>
+        <string>things</string>
+        <key>thoughout</key>
+        <string>throughout</string>
+        <key>threatend</key>
+        <string>threatened</string>
+        <key>threatning</key>
+        <string>threatening</string>
+        <key>threee</key>
+        <string>three</string>
+        <key>threshhold</key>
+        <string>threshold</string>
+        <key>thrid</key>
+        <string>third</string>
+        <key>throrough</key>
+        <string>thorough</string>
+        <key>throughly</key>
+        <string>thoroughly</string>
+        <key>throught</key>
+        <string>throat</string>
+        <key>througout</key>
+        <string>throughout</string>
+        <key>thru</key>
+        <string>through</string>
+        <key>thsi</key>
+        <string>this</string>
+        <key>thsoe</key>
+        <string>those</string>
+        <key>thta</key>
+        <string>that</string>
+        <key>thyat</key>
+        <string>that</string>
+        <key>tiem</key>
+        <string>time</string>
+        <key>tihkn</key>
+        <string>think</string>
+        <key>tihs</key>
+        <string>this</string>
+        <key>timne</key>
+        <string>time</string>
+        <key>tiome</key>
+        <string>time</string>
+        <key>tje</key>
+        <string>the</string>
+        <key>tjhe</key>
+        <string>the</string>
+        <key>tjpanishad</key>
+        <string>upanishad</string>
+        <key>tkae</key>
+        <string>take</string>
+        <key>tkaes</key>
+        <string>takes</string>
+        <key>tkaing</key>
+        <string>taking</string>
+        <key>tlaking</key>
+        <string>talking</string>
+        <key>tobbaco</key>
+        <string>tobacco</string>
+        <key>todays</key>
+        <string>today&apos;s</string>
+        <key>todya</key>
+        <string>today</string>
+        <key>toghether</key>
+        <string>together</string>
+        <key>toke</key>
+        <string>took</string>
+        <key>tolerence</key>
+        <string>tolerance</string>
+        <key>tomatos</key>
+        <string>tomatoes</string>
+        <key>tommorow</key>
+        <string>tomorrow</string>
+        <key>tommorrow</key>
+        <string>tomorrow</string>
+        <key>tongiht</key>
+        <string>tonight</string>
+        <key>toriodal</key>
+        <string>toroidal</string>
+        <key>tormenters</key>
+        <string>tormentors</string>
+        <key>tornadoe</key>
+        <string>tornado</string>
+        <key>torpeados</key>
+        <string>torpedoes</string>
+        <key>torpedos</key>
+        <string>torpedoes</string>
+        <key>tothe</key>
+        <string>to the</string>
+        <key>toubles</key>
+        <string>troubles</string>
+        <key>tounge</key>
+        <string>tongue</string>
+        <key>tourch</key>
+        <string>torch</string>
+        <key>towords</key>
+        <string>towards</string>
+        <key>towrad</key>
+        <string>toward</string>
+        <key>tradionally</key>
+        <string>traditionally</string>
+        <key>traditionaly</key>
+        <string>traditionally</string>
+        <key>traditionnal</key>
+        <string>traditional</string>
+        <key>traditition</key>
+        <string>tradition</string>
+        <key>tradtionally</key>
+        <string>traditionally</string>
+        <key>trafficed</key>
+        <string>trafficked</string>
+        <key>trafficing</key>
+        <string>trafficking</string>
+        <key>trafic</key>
+        <string>traffic</string>
+        <key>trancendent</key>
+        <string>transcendent</string>
+        <key>trancending</key>
+        <string>transcending</string>
+        <key>tranform</key>
+        <string>transform</string>
+        <key>tranformed</key>
+        <string>transformed</string>
+        <key>transcendance</key>
+        <string>transcendence</string>
+        <key>transcendant</key>
+        <string>transcendent</string>
+        <key>transcendentational</key>
+        <string>transcendental</string>
+        <key>transcripting</key>
+        <string>transcribing</string>
+        <key>transending</key>
+        <string>transcending</string>
+        <key>transesxuals</key>
+        <string>transsexuals</string>
+        <key>transfered</key>
+        <string>transferred</string>
+        <key>transfering</key>
+        <string>transferring</string>
+        <key>transformaton</key>
+        <string>transformation</string>
+        <key>transistion</key>
+        <string>transition</string>
+        <key>translater</key>
+        <string>translator</string>
+        <key>translaters</key>
+        <string>translators</string>
+        <key>transmissable</key>
+        <string>transmissible</string>
+        <key>transporation</key>
+        <string>transportation</string>
+        <key>tremelo</key>
+        <string>tremolo</string>
+        <key>tremelos</key>
+        <string>tremolos</string>
+        <key>triguered</key>
+        <string>triggered</string>
+        <key>triology</key>
+        <string>trilogy</string>
+        <key>troling</key>
+        <string>trolling</string>
+        <key>troup</key>
+        <string>troupe</string>
+        <key>troups</key>
+        <string>troops</string>
+        <key>truely</key>
+        <string>truly</string>
+        <key>trustworthyness</key>
+        <string>trustworthiness</string>
+        <key>turnk</key>
+        <string>trunk</string>
+        <key>tust</key>
+        <string>trust</string>
+        <key>twelth</key>
+        <string>twelfth</string>
+        <key>twon</key>
+        <string>town</string>
+        <key>twpo</key>
+        <string>two</string>
+        <key>tyhat</key>
+        <string>that</string>
+        <key>tyhe</key>
+        <string>they</string>
+        <key>typcial</key>
+        <string>typical</string>
+        <key>typicaly</key>
+        <string>typically</string>
+        <key>tyranies</key>
+        <string>tyrannies</string>
+        <key>tyrany</key>
+        <string>tyranny</string>
+        <key>tyrranies</key>
+        <string>tyrannies</string>
+        <key>tyrrany</key>
+        <string>tyranny</string>
+        <key>ubiquitious</key>
+        <string>ubiquitous</string>
+        <key>ublisher</key>
+        <string>publisher</string>
+        <key>uise</key>
+        <string>use</string>
+        <key>ultimely</key>
+        <string>ultimately</string>
+        <key>unacompanied</key>
+        <string>unaccompanied</string>
+        <key>unahppy</key>
+        <string>unhappy</string>
+        <key>unanymous</key>
+        <string>unanimous</string>
+        <key>unathorised</key>
+        <string>unauthorised</string>
+        <key>unavailible</key>
+        <string>unavailable</string>
+        <key>unballance</key>
+        <string>unbalance</string>
+        <key>unbeknowst</key>
+        <string>unbeknownst</string>
+        <key>unbeleivable</key>
+        <string>unbelievable</string>
+        <key>uncertainity</key>
+        <string>uncertainty</string>
+        <key>unchallengable</key>
+        <string>unchallengeable</string>
+        <key>unchangable</key>
+        <string>unchangeable</string>
+        <key>uncompetive</key>
+        <string>uncompetitive</string>
+        <key>unconcious</key>
+        <string>unconscious</string>
+        <key>unconciousness</key>
+        <string>unconsciousness</string>
+        <key>unconfortability</key>
+        <string>discomfort</string>
+        <key>uncontitutional</key>
+        <string>unconstitutional</string>
+        <key>unconvential</key>
+        <string>unconventional</string>
+        <key>undecideable</key>
+        <string>undecidable</string>
+        <key>understoon</key>
+        <string>understood</string>
+        <key>undesireable</key>
+        <string>undesirable</string>
+        <key>undetecable</key>
+        <string>undetectable</string>
+        <key>undoubtely</key>
+        <string>undoubtedly</string>
+        <key>undreground</key>
+        <string>underground</string>
+        <key>uneccesary</key>
+        <string>unnecessary</string>
+        <key>unecessary</key>
+        <string>unnecessary</string>
+        <key>unequalities</key>
+        <string>inequalities</string>
+        <key>unforetunately</key>
+        <string>unfortunately</string>
+        <key>unforgetable</key>
+        <string>unforgettable</string>
+        <key>unforgiveable</key>
+        <string>unforgivable</string>
+        <key>unfortunatley</key>
+        <string>unfortunately</string>
+        <key>unfortunatly</key>
+        <string>unfortunately</string>
+        <key>unfourtunately</key>
+        <string>unfortunately</string>
+        <key>unihabited</key>
+        <string>uninhabited</string>
+        <key>unilateraly</key>
+        <string>unilaterally</string>
+        <key>unilatreal</key>
+        <string>unilateral</string>
+        <key>unilatreally</key>
+        <string>unilaterally</string>
+        <key>uninterruped</key>
+        <string>uninterrupted</string>
+        <key>uninterupted</key>
+        <string>uninterrupted</string>
+        <key>univeral</key>
+        <string>universal</string>
+        <key>univeristies</key>
+        <string>universities</string>
+        <key>univeristy</key>
+        <string>university</string>
+        <key>univerity</key>
+        <string>university</string>
+        <key>universtiy</key>
+        <string>university</string>
+        <key>univesities</key>
+        <string>universities</string>
+        <key>univesity</key>
+        <string>university</string>
+        <key>unkown</key>
+        <string>unknown</string>
+        <key>unlikey</key>
+        <string>unlikely</string>
+        <key>unmanouverable</key>
+        <string>unmaneuverable</string>
+        <key>unmistakeably</key>
+        <string>unmistakably</string>
+        <key>unneccesarily</key>
+        <string>unnecessarily</string>
+        <key>unneccesary</key>
+        <string>unnecessary</string>
+        <key>unneccessarily</key>
+        <string>unnecessarily</string>
+        <key>unneccessary</key>
+        <string>unnecessary</string>
+        <key>unnecesarily</key>
+        <string>unnecessarily</string>
+        <key>unnecesary</key>
+        <string>unnecessary</string>
+        <key>unoffical</key>
+        <string>unofficial</string>
+        <key>unoperational</key>
+        <string>nonoperational</string>
+        <key>unoticeable</key>
+        <string>unnoticeable</string>
+        <key>unplease</key>
+        <string>displease</string>
+        <key>unplesant</key>
+        <string>unpleasant</string>
+        <key>unprecendented</key>
+        <string>unprecedented</string>
+        <key>unprecidented</key>
+        <string>unprecedented</string>
+        <key>unrepentent</key>
+        <string>unrepentant</string>
+        <key>unrepetant</key>
+        <string>unrepentant</string>
+        <key>unrepetent</key>
+        <string>unrepentant</string>
+        <key>unsed</key>
+        <string>unused</string>
+        <key>unsubstanciated</key>
+        <string>unsubstantiated</string>
+        <key>unsuccesful</key>
+        <string>unsuccessful</string>
+        <key>unsuccesfully</key>
+        <string>unsuccessfully</string>
+        <key>unsuccessfull</key>
+        <string>unsuccessful</string>
+        <key>unsucesful</key>
+        <string>unsuccessful</string>
+        <key>unsucesfuly</key>
+        <string>unsuccessfully</string>
+        <key>unsucessful</key>
+        <string>unsuccessful</string>
+        <key>unsucessfull</key>
+        <string>unsuccessful</string>
+        <key>unsucessfully</key>
+        <string>unsuccessfully</string>
+        <key>unsuprised</key>
+        <string>unsurprised</string>
+        <key>unsuprising</key>
+        <string>unsurprising</string>
+        <key>unsuprisingly</key>
+        <string>unsurprisingly</string>
+        <key>unsuprized</key>
+        <string>unsurprised</string>
+        <key>unsuprizing</key>
+        <string>unsurprising</string>
+        <key>unsuprizingly</key>
+        <string>unsurprisingly</string>
+        <key>unsurprized</key>
+        <string>unsurprised</string>
+        <key>unsurprizing</key>
+        <string>unsurprising</string>
+        <key>unsurprizingly</key>
+        <string>unsurprisingly</string>
+        <key>untill</key>
+        <string>until</string>
+        <key>untranslateable</key>
+        <string>untranslatable</string>
+        <key>unuseable</key>
+        <string>unusable</string>
+        <key>unusuable</key>
+        <string>unusable</string>
+        <key>unviersity</key>
+        <string>university</string>
+        <key>unwarrented</key>
+        <string>unwarranted</string>
+        <key>unweildly</key>
+        <string>unwieldy</string>
+        <key>unwieldly</key>
+        <string>unwieldy</string>
+        <key>upcomming</key>
+        <string>upcoming</string>
+        <key>upgradded</key>
+        <string>upgraded</string>
+        <key>upto</key>
+        <string>up to</string>
+        <key>usally</key>
+        <string>usually</string>
+        <key>useage</key>
+        <string>usage</string>
+        <key>usefull</key>
+        <string>useful</string>
+        <key>usefuly</key>
+        <string>usefully</string>
+        <key>useing</key>
+        <string>using</string>
+        <key>usualy</key>
+        <string>usually</string>
+        <key>ususally</key>
+        <string>usually</string>
+        <key>vaccum</key>
+        <string>vacuum</string>
+        <key>vaccume</key>
+        <string>vacuum</string>
+        <key>vacinity</key>
+        <string>vicinity</string>
+        <key>vaguaries</key>
+        <string>vagaries</string>
+        <key>vaieties</key>
+        <string>varieties</string>
+        <key>vailidty</key>
+        <string>validity</string>
+        <key>valetta</key>
+        <string>valletta</string>
+        <key>valuble</key>
+        <string>valuable</string>
+        <key>valueable</key>
+        <string>valuable</string>
+        <key>varations</key>
+        <string>variations</string>
+        <key>varient</key>
+        <string>variant</string>
+        <key>variey</key>
+        <string>variety</string>
+        <key>varing</key>
+        <string>varying</string>
+        <key>varities</key>
+        <string>varieties</string>
+        <key>varity</key>
+        <string>variety</string>
+        <key>vasall</key>
+        <string>vassal</string>
+        <key>vasalls</key>
+        <string>vassals</string>
+        <key>vegatarian</key>
+        <string>vegetarian</string>
+        <key>vegitable</key>
+        <string>vegetable</string>
+        <key>vegitables</key>
+        <string>vegetables</string>
+        <key>vegtable</key>
+        <string>vegetable</string>
+        <key>vehicule</key>
+        <string>vehicle</string>
+        <key>vell</key>
+        <string>well</string>
+        <key>venemous</key>
+        <string>venomous</string>
+        <key>vengance</key>
+        <string>vengeance</string>
+        <key>vengence</key>
+        <string>vengeance</string>
+        <key>verfication</key>
+        <string>verification</string>
+        <key>verison</key>
+        <string>version</string>
+        <key>verisons</key>
+        <string>versions</string>
+        <key>vermillion</key>
+        <string>vermilion</string>
+        <key>versitilaty</key>
+        <string>versatility</string>
+        <key>versitlity</key>
+        <string>versatility</string>
+        <key>vetween</key>
+        <string>between</string>
+        <key>veyr</key>
+        <string>very</string>
+        <key>vigeur</key>
+        <string>vigor</string>
+        <key>vigilence</key>
+        <string>vigilance</string>
+        <key>vigourous</key>
+        <string>vigorous</string>
+        <key>villian</key>
+        <string>villain</string>
+        <key>villification</key>
+        <string>vilification</string>
+        <key>villify</key>
+        <string>vilify</string>
+        <key>villin</key>
+        <string>villain</string>
+        <key>vincinity</key>
+        <string>vicinity</string>
+        <key>violentce</key>
+        <string>violence</string>
+        <key>virtualy</key>
+        <string>virtually</string>
+        <key>virutal</key>
+        <string>virtual</string>
+        <key>virutally</key>
+        <string>virtually</string>
+        <key>visable</key>
+        <string>visible</string>
+        <key>visably</key>
+        <string>visibly</string>
+        <key>visting</key>
+        <string>visiting</string>
+        <key>vistors</key>
+        <string>visitors</string>
+        <key>vitories</key>
+        <string>victories</string>
+        <key>volcanoe</key>
+        <string>volcano</string>
+        <key>voleyball</key>
+        <string>volleyball</string>
+        <key>volontary</key>
+        <string>voluntary</string>
+        <key>volonteer</key>
+        <string>volunteer</string>
+        <key>volonteered</key>
+        <string>volunteered</string>
+        <key>volonteering</key>
+        <string>volunteering</string>
+        <key>volonteers</key>
+        <string>volunteers</string>
+        <key>volounteer</key>
+        <string>volunteer</string>
+        <key>volounteered</key>
+        <string>volunteered</string>
+        <key>volounteering</key>
+        <string>volunteering</string>
+        <key>volounteers</key>
+        <string>volunteers</string>
+        <key>volumne</key>
+        <string>volume</string>
+        <key>vreity</key>
+        <string>variety</string>
+        <key>vrey</key>
+        <string>very</string>
+        <key>vriety</key>
+        <string>variety</string>
+        <key>vulnerablility</key>
+        <string>vulnerability</string>
+        <key>vyer</key>
+        <string>very</string>
+        <key>vyre</key>
+        <string>very</string>
+        <key>waht</key>
+        <string>what</string>
+        <key>wanna</key>
+        <string>want to</string>
+        <key>warantee</key>
+        <string>warranty</string>
+        <key>wardobe</key>
+        <string>wardrobe</string>
+        <key>warrent</key>
+        <string>warrant</string>
+        <key>warrriors</key>
+        <string>warriors</string>
+        <key>wasnt</key>
+        <string>wasn&apos;t</string>
+        <key>wass</key>
+        <string>was</string>
+        <key>watn</key>
+        <string>want</string>
+        <key>wayword</key>
+        <string>wayward</string>
+        <key>weaponary</key>
+        <string>weaponry</string>
+        <key>weas</key>
+        <string>was</string>
+        <key>wehn</key>
+        <string>when</string>
+        <key>weild</key>
+        <string>wield</string>
+        <key>weilded</key>
+        <string>wielded</string>
+        <key>wendsay</key>
+        <string>Wednesday</string>
+        <key>wensday</key>
+        <string>Wednesday</string>
+        <key>wereabouts</key>
+        <string>whereabouts</string>
+        <key>whant</key>
+        <string>want</string>
+        <key>whants</key>
+        <string>wants</string>
+        <key>whcih</key>
+        <string>which</string>
+        <key>wheras</key>
+        <string>whereas</string>
+        <key>wherease</key>
+        <string>whereas</string>
+        <key>whereever</key>
+        <string>wherever</string>
+        <key>whic</key>
+        <string>which</string>
+        <key>whihc</key>
+        <string>which</string>
+        <key>whith</key>
+        <string>with</string>
+        <key>whlch</key>
+        <string>which</string>
+        <key>whn</key>
+        <string>when</string>
+        <key>wholey</key>
+        <string>wholly</string>
+        <key>wholy</key>
+        <string>holy</string>
+        <key>whta</key>
+        <string>what</string>
+        <key>whther</key>
+        <string>whether</string>
+        <key>wich</key>
+        <string>which</string>
+        <key>widesread</key>
+        <string>widespread</string>
+        <key>wief</key>
+        <string>wife</string>
+        <key>wierd</key>
+        <string>weird</string>
+        <key>wiew</key>
+        <string>view</string>
+        <key>wih</key>
+        <string>with</string>
+        <key>wiht</key>
+        <string>with</string>
+        <key>wille</key>
+        <string>will</string>
+        <key>willingless</key>
+        <string>willingness</string>
+        <key>wirting</key>
+        <string>writing</string>
+        <key>withdrawl</key>
+        <string>withdrawal</string>
+        <key>witheld</key>
+        <string>withheld</string>
+        <key>withh</key>
+        <string>with</string>
+        <key>withing</key>
+        <string>within</string>
+        <key>withold</key>
+        <string>withhold</string>
+        <key>witht</key>
+        <string>with</string>
+        <key>witn</key>
+        <string>with</string>
+        <key>wiull</key>
+        <string>will</string>
+        <key>wnat</key>
+        <string>want</string>
+        <key>wnated</key>
+        <string>wanted</string>
+        <key>wnats</key>
+        <string>wants</string>
+        <key>wohle</key>
+        <string>whole</string>
+        <key>wokr</key>
+        <string>work</string>
+        <key>wokring</key>
+        <string>working</string>
+        <key>wonderfull</key>
+        <string>wonderful</string>
+        <key>wont</key>
+        <string>won&apos;t</string>
+        <key>wordlwide</key>
+        <string>worldwide</string>
+        <key>workststion</key>
+        <string>workstation</string>
+        <key>worls</key>
+        <string>world</string>
+        <key>worstened</key>
+        <string>worsened</string>
+        <key>woudl</key>
+        <string>would</string>
+        <key>wresters</key>
+        <string>wrestlers</string>
+        <key>wriet</key>
+        <string>write</string>
+        <key>writen</key>
+        <string>written</string>
+        <key>wroet</key>
+        <string>wrote</string>
+        <key>wrok</key>
+        <string>work</string>
+        <key>wroking</key>
+        <string>working</string>
+        <key>wtih</key>
+        <string>with</string>
+        <key>wupport</key>
+        <string>support</string>
+        <key>xenophoby</key>
+        <string>xenophobia</string>
+        <key>yaching</key>
+        <string>yachting</string>
+        <key>yaer</key>
+        <string>year</string>
+        <key>yaerly</key>
+        <string>yearly</string>
+        <key>yaers</key>
+        <string>years</string>
+        <key>yatch</key>
+        <string>yacht</string>
+        <key>yearm</key>
+        <string>year</string>
+        <key>yeasr</key>
+        <string>years</string>
+        <key>yeild</key>
+        <string>yield</string>
+        <key>yeilding</key>
+        <string>yielding</string>
+        <key>yera</key>
+        <string>year</string>
+        <key>yeras</key>
+        <string>years</string>
+        <key>yersa</key>
+        <string>years</string>
+        <key>yotube</key>
+        <string>YouTube</string>
+        <key>youre</key>
+        <string>you&apos;re</string>
+        <key>youseff</key>
+        <string>yousef</string>
+        <key>youself</key>
+        <string>yourself</string>
+        <key>ytou</key>
+        <string>you</string>
+        <key>yuo</key>
+        <string>you</string>
+        <key>zeebra</key>
+        <string>zebra</string>
+      </map>
+    </map>
+  </array>
+</llsd>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 2c5960ccd5a3c09e9072159de30f2c78f4306a9c..2f6811c26f9bcaf0c706c4888c9751d8a9db109b 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -335,6 +335,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>AutoReplace</key>
+    <map>
+      <key>Comment</key>
+      <string>Replaces keywords with a configured word or phrase</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
   <key>AutoAcceptNewInventory</key>
     <map>
       <key>Comment</key>
@@ -12250,6 +12261,28 @@
       <key>Value</key>
       <real>10.0</real>
     </map>
+    <key>SpellCheck</key>
+    <map>
+      <key>Comment</key>
+      <string>Enable spellchecking on line and text editors</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>SpellCheckDictionary</key>
+    <map>
+      <key>Comment</key>
+      <string>Current primary and secondary dictionaries used for spell checking</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string>English (United States),Second Life Glossary</string>
+    </map>
     <key>UseNewWalkRun</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index d033252029f7ec53d8a0fd12534d2547e5ae2594..b4d205adb58ddb486f5af391576a2aba2ed458d4 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -94,6 +94,7 @@
 #include "llupdaterservice.h"
 #include "llcallfloater.h"
 #include "llfloatertexturefetchdebugger.h"
+#include "llspellcheck.h"
 
 // Linden library includes
 #include "llavatarnamecache.h"
@@ -117,6 +118,7 @@
 // Third party library includes
 #include <boost/bind.hpp>
 #include <boost/foreach.hpp>
+#include <boost/algorithm/string.hpp>
 
 
 
@@ -2558,6 +2560,19 @@ bool LLAppViewer::initConfiguration()
 		//gDirUtilp->setSkinFolder("default");
     }
 
+	if (gSavedSettings.getBOOL("SpellCheck"))
+	{
+		std::list<std::string> dict_list;
+		std::string dict_setting = gSavedSettings.getString("SpellCheckDictionary");
+		boost::split(dict_list, dict_setting, boost::is_any_of(std::string(",")));
+		if (!dict_list.empty())
+		{
+			LLSpellChecker::setUseSpellCheck(dict_list.front());
+			dict_list.pop_front();
+			LLSpellChecker::instance().setSecondaryDictionaries(dict_list);
+		}
+	}
+
     mYieldTime = gSavedSettings.getS32("YieldTime");
 
 	// Read skin/branding settings if specified.
diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0f1ce2bcd060d3a3d115203bb7aecec1a5fb43ee
--- /dev/null
+++ b/indra/newview/llautoreplace.cpp
@@ -0,0 +1,771 @@
+/**
+ * @file llautoreplace.cpp
+ * @brief Auto Replace Manager
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llautoreplace.h"
+#include "llsdserialize.h"
+#include "llboost.h"
+#include "llcontrol.h"
+#include "llviewercontrol.h"
+#include "llnotificationsutil.h"
+
+LLAutoReplace* LLAutoReplace::sInstance;
+
+const char* LLAutoReplace::SETTINGS_FILE_NAME = "autoreplace.xml";
+
+LLAutoReplace::LLAutoReplace()
+{
+}
+
+LLAutoReplace::~LLAutoReplace()
+{
+	sInstance = NULL;
+}
+
+void LLAutoReplace::autoreplaceCallback(LLUIString& inputText, S32& cursorPos)
+{
+	static LLCachedControl<bool> perform_autoreplace(gSavedSettings, "AutoReplace");
+	if(perform_autoreplace)
+	{
+		S32 wordEnd = cursorPos-1;
+		LLWString text = inputText.getWString();
+
+		bool atSpace  = (text[wordEnd] == ' ');
+		bool haveWord = (LLWStringUtil::isPartOfWord(text[wordEnd]));
+
+		if (atSpace || haveWord)
+		{
+			if (atSpace && wordEnd > 0)
+			{
+				// find out if this space immediately follows a word
+				wordEnd--;
+				haveWord  = (LLWStringUtil::isPartOfWord(text[wordEnd]));
+			}
+			if (haveWord)
+			{
+				// wordEnd points to the end of a word, now find the start of the word
+				std::string word;
+				S32 wordStart = wordEnd;
+				for ( S32 backOne = wordStart - 1;
+					  backOne >= 0 && LLWStringUtil::isPartOfWord(text[backOne]);
+					  backOne--
+					 )
+				{
+					wordStart--; // walk wordStart back to the beginning of the word
+				}
+				LL_DEBUGS("AutoReplace")<<"wordStart: "<<wordStart<<" wordEnd: "<<wordEnd<<LL_ENDL;
+				std::string strText  = std::string(text.begin(), text.end());
+				std::string lastWord = strText.substr(wordStart, wordEnd-wordStart+1);
+				std::string replacementWord( mSettings.replaceWord( lastWord ) );
+
+				if ( replacementWord != lastWord )
+				{
+					// The last word is one for which we have a replacement
+					if (atSpace)
+					{
+						// replace the last word in the input
+						LLWString strNew = utf8str_to_wstring(replacementWord);
+						LLWString strOld = utf8str_to_wstring(lastWord);
+						int size_change = strNew.size() - strOld.size();
+
+						text.replace(wordStart,lastWord.length(),strNew);
+						inputText = wstring_to_utf8str(text);
+						cursorPos+=size_change;
+					}
+				}
+			}
+		}
+	}
+}
+
+LLAutoReplace* LLAutoReplace::getInstance()
+{
+	if(!sInstance)
+	{
+		sInstance = new LLAutoReplace();
+		sInstance->loadFromSettings();
+	}
+	return sInstance;
+}
+
+std::string LLAutoReplace::getUserSettingsFileName()
+{
+	std::string path=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
+
+	if (!path.empty())
+	{
+		path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, SETTINGS_FILE_NAME);
+	}
+	return path;
+}
+
+std::string LLAutoReplace::getAppSettingsFileName()
+{
+	std::string path=gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "");
+
+	if (!path.empty())
+	{
+		path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, SETTINGS_FILE_NAME);
+	}
+	else
+	{
+		LL_ERRS("AutoReplace") << "Failed to get app settings directory name" << LL_ENDL;
+	}
+	return path;
+}
+
+LLAutoReplaceSettings LLAutoReplace::getSettings()
+{
+	return mSettings;
+}
+
+void LLAutoReplace::setSettings(const LLAutoReplaceSettings& newSettings)
+{
+	mSettings.set(newSettings);
+	/// Make the newSettings active and write them to user storage
+	saveToUserSettings();
+}
+
+void LLAutoReplace::loadFromSettings()
+{
+	std::string filename=getUserSettingsFileName();
+	if (filename.empty())
+	{
+		LL_INFOS("AutoReplace") << "no valid user settings directory." << LL_ENDL;
+	}
+	if(gDirUtilp->fileExists(filename))
+	{
+		LLSD userSettings;
+		llifstream file;
+		file.open(filename.c_str());
+		if (file.is_open())
+		{
+			LLSDSerialize::fromXML(userSettings, file);
+		}
+		file.close();
+		if ( mSettings.setFromLLSD(userSettings) )
+		{
+			LL_INFOS("AutoReplace") << "settings loaded from '" << filename << "'" << LL_ENDL;
+		}
+		else
+		{
+			LL_WARNS("AutoReplace") << "invalid settings found in '" << filename << "'" << LL_ENDL;
+		}
+	}
+	else // no user settings found, try application settings
+	{
+		std::string defaultName = getAppSettingsFileName();
+		LL_INFOS("AutoReplace") << " user settings file '" << filename << "' not found"<< LL_ENDL;
+
+		bool gotSettings = false;
+		if(gDirUtilp->fileExists(defaultName))
+		{
+			LLSD appDefault;
+			llifstream file;
+			file.open(defaultName.c_str());
+			if (file.is_open())
+			{
+				LLSDSerialize::fromXMLDocument(appDefault, file);
+			}
+			file.close();
+
+			if ( mSettings.setFromLLSD(appDefault) )
+			{
+				LL_INFOS("AutoReplace") << "settings loaded from '" << defaultName.c_str() << "'" << LL_ENDL;
+				gotSettings = true;
+			}
+			else
+			{
+				LL_WARNS("AutoReplace") << "invalid settings found in '" << defaultName.c_str() << "'" << LL_ENDL;
+			}
+		}
+		
+		if ( ! gotSettings )
+		{
+			if (mSettings.setFromLLSD(mSettings.getExampleLLSD()))
+			{
+				LL_WARNS("AutoReplace") << "no settings found; loaded example." << LL_ENDL;
+			}
+			else
+			{
+				LL_WARNS("AutoReplace") << "no settings found and example invalid!" << LL_ENDL;
+			}
+		}
+	}
+}
+
+void LLAutoReplace::saveToUserSettings()
+{
+	std::string filename=getUserSettingsFileName();
+	llofstream file;
+	file.open(filename.c_str());
+	LLSDSerialize::toPrettyXML(mSettings.getAsLLSD(), file);
+	file.close();
+	LL_INFOS("AutoReplace") << "settings saved to '" << filename << "'" << LL_ENDL;
+}
+
+// ================================================================
+// LLAutoReplaceSettings
+// ================================================================
+
+const std::string LLAutoReplaceSettings::AUTOREPLACE_LIST_NAME         = "name";    	 ///< key for looking up list names
+const std::string LLAutoReplaceSettings::AUTOREPLACE_LIST_REPLACEMENTS = "replacements"; ///< key for looking up replacement map
+
+LLAutoReplaceSettings::LLAutoReplaceSettings()
+{
+}
+
+LLAutoReplaceSettings::LLAutoReplaceSettings(const LLAutoReplaceSettings& settings)
+{
+	// copy all values through fundamental type intermediates for thread safety
+	mLists = LLSD::emptyArray();
+
+	for ( LLSD::array_const_iterator list = settings.mLists.beginArray(), listEnd = settings.mLists.endArray();
+		  list != listEnd;
+		  list++
+		 )
+	{
+		if ( (*list).isMap() ) // can fail due to LLSD-30: ignore it
+		{
+			LLSD listMap = LLSD::emptyMap();
+			std::string listName = (*list)[AUTOREPLACE_LIST_NAME];
+			listMap[AUTOREPLACE_LIST_NAME] = listName;
+			listMap[AUTOREPLACE_LIST_REPLACEMENTS] = LLSD::emptyMap();
+
+			for ( LLSD::map_const_iterator
+					  entry = (*list)[AUTOREPLACE_LIST_REPLACEMENTS].beginMap(),
+					  entriesEnd = (*list)[AUTOREPLACE_LIST_REPLACEMENTS].endMap();
+				  entry != entriesEnd;
+				  entry++
+				 )
+			{
+				std::string keyword = entry->first;
+				std::string replacement = entry->second.asString();
+				listMap[AUTOREPLACE_LIST_REPLACEMENTS].insert(keyword, LLSD(replacement));
+			}
+
+			mLists.append(listMap);
+		}
+	}
+}
+
+void LLAutoReplaceSettings::set(const LLAutoReplaceSettings& newSettings)
+{
+	mLists = newSettings.mLists;
+}
+
+bool LLAutoReplaceSettings::setFromLLSD(const LLSD& settingsFromLLSD)
+{
+	bool settingsValid = true;
+
+	if ( settingsFromLLSD.isArray() )
+	{
+		for ( LLSD::array_const_iterator
+				  list = settingsFromLLSD.beginArray(),
+				  listEnd = settingsFromLLSD.endArray();
+			  settingsValid && list != listEnd;
+			  list++
+			 )
+		{
+			if ( (*list).isDefined() ) // can be undef due to LLSD-30: ignore it
+			{
+				settingsValid = listIsValid(*list);
+			}
+		}
+	}
+	else
+	{
+		settingsValid = false;
+		LL_WARNS("AutoReplace") << "settings are not an array" << LL_ENDL;
+	}
+
+	if ( settingsValid )
+	{
+		mLists = settingsFromLLSD;
+	}
+	else
+	{
+		LL_WARNS("AutoReplace") << "invalid settings discarded; using hard coded example" << LL_ENDL;
+	}
+
+	return settingsValid;
+}
+
+bool LLAutoReplaceSettings::listNameMatches( const LLSD& list, const std::string name )
+{
+	return list.isMap()
+		&& list.has(AUTOREPLACE_LIST_NAME)
+		&& list[AUTOREPLACE_LIST_NAME].asString() == name;
+}
+
+const LLSD* LLAutoReplaceSettings::getListEntries(std::string listName)
+{
+	const LLSD* returnedEntries = NULL;
+	for( LLSD::array_const_iterator list = mLists.beginArray(), endList = mLists.endArray();
+		 returnedEntries == NULL && list != endList;
+		 list++
+		)
+	{
+		const LLSD& thisList = *list;
+		if ( listNameMatches(thisList, listName) )
+		{
+			returnedEntries = &thisList[AUTOREPLACE_LIST_REPLACEMENTS];
+		}
+	}
+	return returnedEntries;
+}
+
+std::string LLAutoReplaceSettings::replacementFor(std::string keyword, std::string listName)
+{
+	std::string replacement;
+	bool foundList = false;
+	for( LLSD::array_const_iterator list = mLists.beginArray(), endList = mLists.endArray();
+		 ! foundList && list != endList;
+		 list++
+		)
+	{
+		const LLSD& thisList = *list;
+		if ( listNameMatches(thisList, listName) )
+		{
+			foundList = true; // whether there is a replacement or not, we're done
+			if (   thisList.isMap()
+				&& thisList.has(AUTOREPLACE_LIST_REPLACEMENTS)
+				&& thisList[AUTOREPLACE_LIST_REPLACEMENTS].has(keyword)
+				)
+			{
+				replacement = thisList[AUTOREPLACE_LIST_REPLACEMENTS][keyword].asString();
+				LL_DEBUGS("AutoReplace")<<"'"<<keyword<<"' -> '"<<replacement<<"'"<<LL_ENDL;
+			}
+		}
+		if (!foundList)
+		{
+			LL_WARNS("AutoReplace")<<"failed to find list '"<<listName<<"'"<<LL_ENDL;
+		}
+	}
+	if (replacement.empty())
+	{
+		LL_WARNS("AutoReplace")<<"failed to find '"<<keyword<<"'"<<LL_ENDL;
+	}
+	return replacement;
+}
+
+LLSD LLAutoReplaceSettings::getListNames()
+{
+	LL_DEBUGS("AutoReplace")<<"====="<<LL_ENDL;
+	LLSD toReturn = LLSD::emptyArray();
+	S32 counter=0;
+	for( LLSD::array_const_iterator list = mLists.beginArray(), endList = mLists.endArray();
+		 list != endList;
+		 list++
+		)
+	{
+		const LLSD& thisList = *list;
+		if ( thisList.isMap() )
+		{
+			if ( thisList.has(AUTOREPLACE_LIST_NAME) )
+			{
+				std::string name = thisList[AUTOREPLACE_LIST_NAME].asString();
+				LL_DEBUGS("AutoReplace")<<counter<<" '"<<name<<"'"<<LL_ENDL;
+				toReturn.append(LLSD(name));
+			}
+			else
+			{
+				LL_ERRS("AutoReplace") <<counter<<" ! MISSING "<<AUTOREPLACE_LIST_NAME<< LL_ENDL;
+			}
+		}
+		else
+		{
+			LL_WARNS("AutoReplace")<<counter<<" ! not a map: "<<LLSD::typeString(thisList.type())<< LL_ENDL;
+		}
+		counter++;
+	}
+	LL_DEBUGS("AutoReplace")<<"^^^^^^"<<LL_ENDL;
+	return toReturn;
+}
+
+bool LLAutoReplaceSettings::listIsValid(const LLSD& list)
+{
+	bool listValid = true;
+	if ( ! list.isMap() )
+	{
+		listValid = false;
+		LL_WARNS("AutoReplace") << "list is not a map" << LL_ENDL;
+	}
+	else if (   ! list.has(AUTOREPLACE_LIST_NAME)
+			 || ! list[AUTOREPLACE_LIST_NAME].isString()
+			 || list[AUTOREPLACE_LIST_NAME].asString().empty()
+			 )
+	{
+		listValid = false;
+		LL_WARNS("AutoReplace")
+			<< "list found without " << AUTOREPLACE_LIST_NAME
+			<< " (or it is empty)"
+			<< LL_ENDL;
+	}
+	else if ( ! list.has(AUTOREPLACE_LIST_REPLACEMENTS) || ! list[AUTOREPLACE_LIST_REPLACEMENTS].isMap() )
+	{
+		listValid = false;
+		LL_WARNS("AutoReplace") << "list '" << list[AUTOREPLACE_LIST_NAME].asString() << "' without " << AUTOREPLACE_LIST_REPLACEMENTS << LL_ENDL;
+	}
+	else
+	{
+		for ( LLSD::map_const_iterator
+				  entry = list[AUTOREPLACE_LIST_REPLACEMENTS].beginMap(),
+				  entriesEnd = list[AUTOREPLACE_LIST_REPLACEMENTS].endMap();
+			  listValid && entry != entriesEnd;
+			  entry++
+			 )
+		{
+			if ( ! entry->second.isString() )
+			{
+				listValid = false;
+				LL_WARNS("AutoReplace")
+					<< "non-string replacement value found in list '"
+					<< list[AUTOREPLACE_LIST_NAME].asString() << "'"
+					<< LL_ENDL;
+			}
+		}
+	}
+
+	return listValid;
+}
+
+const LLSD* LLAutoReplaceSettings::exportList(std::string listName)
+{
+	const LLSD* exportedList = NULL;
+	for ( LLSD::array_const_iterator list = mLists.beginArray(), listEnd = mLists.endArray();
+		  exportedList == NULL && list != listEnd;
+		  list++
+		 )
+	{
+		if ( listNameMatches(*list, listName) )
+		{
+			const LLSD& namedList = (*list);
+			exportedList = &namedList;
+		}
+	}
+	return exportedList;
+}
+
+bool LLAutoReplaceSettings::listNameIsUnique(const LLSD& newList)
+{
+	bool nameIsUnique = true;
+	// this must always be called with a valid list, so it is safe to assume it has a name
+	std::string newListName = newList[AUTOREPLACE_LIST_NAME].asString();
+	for ( LLSD::array_const_iterator list = mLists.beginArray(), listEnd = mLists.endArray();
+		  nameIsUnique && list != listEnd;
+		  list++
+		 )
+	{
+		if ( listNameMatches(*list, newListName) )
+		{
+			LL_WARNS("AutoReplace")<<"duplicate list name '"<<newListName<<"'"<<LL_ENDL;
+			nameIsUnique = false;
+		}
+	}
+	return nameIsUnique;
+}
+
+/* static */
+void LLAutoReplaceSettings::createEmptyList(LLSD& emptyList)
+{
+	emptyList = LLSD::emptyMap();
+	emptyList[AUTOREPLACE_LIST_NAME] = "Empty";
+	emptyList[AUTOREPLACE_LIST_REPLACEMENTS] = LLSD::emptyMap();
+}
+
+/* static */
+void LLAutoReplaceSettings::setListName(LLSD& list, const std::string& newName)
+{
+	list[AUTOREPLACE_LIST_NAME] = newName;
+}
+
+/* static */
+std::string LLAutoReplaceSettings::getListName(LLSD& list)
+{
+	std::string name;
+	if ( list.isMap() && list.has(AUTOREPLACE_LIST_NAME) && list[AUTOREPLACE_LIST_NAME].isString() )
+	{
+		name = list[AUTOREPLACE_LIST_NAME].asString();
+	}
+	return name;
+}
+
+LLAutoReplaceSettings::AddListResult LLAutoReplaceSettings::addList(const LLSD& newList)
+{
+	AddListResult result;
+	if ( listIsValid( newList ) )
+	{
+		if ( listNameIsUnique( newList ) )
+		{
+			mLists.append(newList);
+			result = AddListOk;
+		}
+		else
+		{
+			LL_WARNS("AutoReplace") << "attempt to add duplicate name" << LL_ENDL;
+			result = AddListDuplicateName;
+		}
+	}
+	else
+	{
+		LL_WARNS("AutoReplace") << "attempt to add invalid list" << LL_ENDL;
+		result = AddListInvalidList;
+	}
+	return result;
+}
+
+bool LLAutoReplaceSettings::removeReplacementList(std::string listName)
+{
+	bool found = false;
+	for( S32 index = 0; !found && mLists[index].isDefined(); index++ )
+	{
+		if( listNameMatches(mLists.get(index), listName) )
+		{
+			LL_DEBUGS("AutoReplace")<<"list '"<<listName<<"'"<<LL_ENDL;
+			mLists.erase(index);
+			found = true;
+		}
+	}
+	return found;
+}
+
+/// Move the named list up in the priority order
+bool LLAutoReplaceSettings::increaseListPriority(std::string listName)
+{
+	LL_DEBUGS("AutoReplace")<<listName<<LL_ENDL;
+	bool found = false;
+	S32 search_index, previous_index;
+	LLSD targetList;
+	// The following is working around the fact that LLSD arrays containing maps also seem to have undefined entries... see LLSD-30
+	previous_index = -1;
+	for ( search_index = 0, targetList = mLists[0];
+		  !found && search_index < mLists.size();
+		  search_index += 1, targetList = mLists[search_index]
+		 )
+	{
+		if ( targetList.isMap() )
+		{
+			if ( listNameMatches( targetList, listName) )
+			{
+				LL_DEBUGS("AutoReplace")<<"found at "<<search_index<<", previous is "<<previous_index<<LL_ENDL;
+				found = true;
+				if (previous_index >= 0)
+				{
+					LL_DEBUGS("AutoReplace") << "erase "<<search_index<<LL_ENDL;
+					mLists.erase(search_index);
+					LL_DEBUGS("AutoReplace") << "insert at "<<previous_index<<LL_ENDL;
+					mLists.insert(previous_index, targetList);
+				} 
+				else
+				{
+					LL_WARNS("AutoReplace") << "attempted to move top list up" << LL_ENDL;
+				}
+			}
+			else
+			{
+				previous_index = search_index;
+			}
+		}
+		else
+		{
+			LL_DEBUGS("AutoReplace") << search_index<<" is "<<LLSD::typeString(targetList.type())<<LL_ENDL;
+		}		
+	}
+	return found;
+}
+
+/// Move the named list down in the priority order
+bool LLAutoReplaceSettings::decreaseListPriority(std::string listName)
+{
+	LL_DEBUGS("AutoReplace")<<listName<<LL_ENDL;
+	S32 found_index = -1;	
+	S32 search_index;
+	for ( search_index = 0;
+		  found_index == -1 && search_index < mLists.size();
+		  search_index++
+		 )
+	{
+		if ( listNameMatches( mLists[search_index], listName) )
+		{
+			LL_DEBUGS("AutoReplace")<<"found at index "<<search_index<<LL_ENDL;
+			found_index = search_index;
+		}
+	}
+	if (found_index != -1)
+	{
+		S32 next_index;
+		for ( next_index = found_index+1;
+			  next_index < mLists.size() && ! mLists[next_index].isMap();
+			  next_index++
+			 )
+		{
+			// skipping over any undefined slots (see LLSD-30)
+			LL_WARNS("AutoReplace")<<next_index<<" ! not a map: "<<LLSD::typeString(mLists[next_index].type())<< LL_ENDL;
+		}
+		if ( next_index < mLists.size() )
+		{
+			LLSD next_list = mLists[next_index];
+			LL_DEBUGS("AutoReplace") << "erase "<<next_index<<LL_ENDL;
+			mLists.erase(next_index);
+			LL_DEBUGS("AutoReplace") << "insert at "<<found_index<<LL_ENDL;
+			mLists.insert(found_index, next_list);
+		}
+		else
+		{
+			LL_WARNS("AutoReplace") << "attempted to move bottom list down" << LL_ENDL;
+		}
+	}
+	else
+	{
+		LL_WARNS("AutoReplace") << "not found" << LL_ENDL;
+	}
+	return (found_index != -1);
+}
+
+
+std::string LLAutoReplaceSettings::replaceWord(const std::string currentWord)
+{
+	std::string returnedWord = currentWord; // in case no replacement is found
+	static LLCachedControl<bool> autoreplace_enabled(gSavedSettings, "AutoReplace");
+	if ( autoreplace_enabled )
+	{
+		LL_DEBUGS("AutoReplace")<<"checking '"<<currentWord<<"'"<< LL_ENDL;
+		//loop through lists in order
+		bool found = false;
+		for( LLSD::array_const_iterator list = mLists.beginArray(), endLists = mLists.endArray();
+			 ! found && list != endLists;
+			 list++
+			)
+		{
+			const LLSD& checkList = *list;
+			const LLSD& replacements = checkList[AUTOREPLACE_LIST_REPLACEMENTS];
+
+			if ( replacements.has(currentWord) )
+			{
+				found = true;
+				LL_DEBUGS("AutoReplace")
+					<< "  found in list '" << checkList[AUTOREPLACE_LIST_NAME].asString()
+					<< " => '" << replacements[currentWord].asString() << "'"
+					<< LL_ENDL;
+				returnedWord = replacements[currentWord].asString();
+			}
+		}
+	}
+	return returnedWord;
+}
+
+bool LLAutoReplaceSettings::addEntryToList(LLWString keyword, LLWString replacement, std::string listName)
+{
+	bool added = false;
+
+	if ( ! keyword.empty() && ! replacement.empty() )
+	{
+		bool isOneWord = true;
+		for (S32 character = 0; isOneWord && character < keyword.size(); character++ )
+		{
+			if ( ! LLWStringUtil::isPartOfWord(keyword[character]) )
+			{
+				LL_WARNS("AutoReplace") << "keyword '" << wstring_to_utf8str(keyword) << "' not a single word (len "<<keyword.size()<<" '"<<character<<"')" << LL_ENDL;
+				isOneWord = false;
+			}
+		}
+
+		if ( isOneWord )
+		{
+			bool listFound = false;
+			for( LLSD::array_iterator list = mLists.beginArray(), endLists = mLists.endArray();
+				 ! listFound && list != endLists;
+				 list++
+				)
+			{
+				if ( listNameMatches(*list, listName) )
+				{
+					listFound = true;
+					(*list)[AUTOREPLACE_LIST_REPLACEMENTS][wstring_to_utf8str(keyword)]=wstring_to_utf8str(replacement);
+				}
+			}
+			if (listFound)
+			{
+				added = true;
+			}
+			else
+			{
+				LL_WARNS("AutoReplace") << "list '" << listName << "' not found" << LL_ENDL;
+			}
+		}
+	}
+
+	return added;
+}
+
+bool LLAutoReplaceSettings::removeEntryFromList(std::string keyword, std::string listName)
+{
+	bool found = false;
+	for( LLSD::array_iterator list = mLists.beginArray(), endLists = mLists.endArray();
+		 ! found && list != endLists;
+		 list++
+		)
+	{
+		if ( listNameMatches(*list, listName) )
+		{
+			found = true;
+			(*list)[AUTOREPLACE_LIST_REPLACEMENTS].erase(keyword);
+		}
+	}
+	if (!found)
+	{
+		LL_WARNS("AutoReplace") << "list '" << listName << "' not found" << LL_ENDL;
+	}
+	return found;
+}
+
+LLSD LLAutoReplaceSettings::getExampleLLSD()
+{
+	LL_DEBUGS("AutoReplace")<<LL_ENDL;
+	LLSD example = LLSD::emptyArray();
+
+	example[0] = LLSD::emptyMap();
+	example[0][AUTOREPLACE_LIST_NAME]    = "Example List 1";
+	example[0][AUTOREPLACE_LIST_REPLACEMENTS]    = LLSD::emptyMap();
+	example[0][AUTOREPLACE_LIST_REPLACEMENTS]["keyword1"] = "replacement string 1";
+	example[0][AUTOREPLACE_LIST_REPLACEMENTS]["keyword2"] = "replacement string 2";
+
+	example[1] = LLSD::emptyMap();
+	example[1][AUTOREPLACE_LIST_NAME]    = "Example List 2";
+	example[1][AUTOREPLACE_LIST_REPLACEMENTS]    = LLSD::emptyMap();
+	example[1][AUTOREPLACE_LIST_REPLACEMENTS]["mistake1"] = "correction 1";
+	example[1][AUTOREPLACE_LIST_REPLACEMENTS]["mistake2"] = "correction 2";
+
+	return example;
+}
+
+const LLSD& LLAutoReplaceSettings::getAsLLSD()
+{
+	return mLists;
+}
+
+LLAutoReplaceSettings::~LLAutoReplaceSettings()
+{
+}
diff --git a/indra/newview/llautoreplace.h b/indra/newview/llautoreplace.h
new file mode 100644
index 0000000000000000000000000000000000000000..30b1fd2c659e604a8564bc9af3e12c6f7ad67d55
--- /dev/null
+++ b/indra/newview/llautoreplace.h
@@ -0,0 +1,228 @@
+/** 
+ * @file llautoreplace.h
+ * @brief Auto Replace Manager
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+#ifndef LLAUTOREPLACE_H
+#define LLAUTOREPLACE_H
+
+#include "lllineeditor.h"
+
+class LLAutoReplace;
+
+/** The configuration data for the LLAutoReplace object
+ *
+ * This is a separate class so that the LLFloaterAutoReplaceSettings
+ * can have a copy of the configuration to manipulate before committing
+ * the changes back to the LLAutoReplace singleton that provides the 
+ * autoreplace callback.
+ */
+class LLAutoReplaceSettings
+{
+  public:
+	LLAutoReplaceSettings();
+	~LLAutoReplaceSettings();
+
+	/// Constructor for creating a tempory copy of the current settings
+	LLAutoReplaceSettings(const LLAutoReplaceSettings& settings);
+
+	/// Replace the current settings with new ones and save them to the user settings file
+	void set(const LLAutoReplaceSettings& newSettings);
+	
+	/// Load the current settings read from an LLSD file
+	bool setFromLLSD(const LLSD& settingsFromLLSD);
+	///< @returns whether or not the settingsFromLLSD were valid
+	
+	// ================================================================
+	///@{ @name List Operations
+	// ================================================================
+
+	/// @returns the configured list names as an LLSD Array of strings
+	LLSD getListNames();
+
+	/// Status values returned from the addList method
+	typedef enum
+	{
+		AddListOk,
+		AddListDuplicateName,
+		AddListInvalidList,
+	} AddListResult;
+	
+	/// Inserts a new list at the end of the priority order
+	AddListResult addList(const LLSD& newList);
+
+	/// Removes the named list, @returns false if not found
+	bool removeReplacementList(std::string listName);
+
+	/// Move the named list up in the priority order 
+	bool increaseListPriority(std::string listName);
+	///< @returns false if the list is not found
+
+	/// Move the named list down in the priority order 
+	bool decreaseListPriority(std::string listName);
+	///< @returns false if the list is not found
+
+	/// Get a copy of just one list (for saving to an export file)
+	const LLSD* exportList(std::string listName);
+	/// @returns an LLSD map 
+
+	/// Checks for required elements, and that each has the correct type.
+	bool listIsValid(const LLSD& listSettings);
+	
+	/// Checks for required elements, and that each has the correct type.
+	bool listNameIs(const LLSD& listSettings);
+	
+	/// Checks to see if a new lists name conflicts with one in the settings
+	bool listNameIsUnique(const LLSD& newList);
+	/// @note must be called with LLSD that has passed listIsValid
+	
+	/// Initializes emptyList to an empty list named 'Empty'
+	static void createEmptyList(LLSD& emptyList);
+
+	/// Resets the name of a list to a new value
+	static void setListName(LLSD& list, const std::string& newName);
+
+	/// Gets the name of a list
+	static std::string getListName(LLSD& list);
+
+    ///@}
+	// ================================================================
+	///@{ @name Replacement Entry Operations
+	// ================================================================
+	
+	/// Get the replacements specified by a given list
+	const LLSD* getListEntries(std::string listName);
+	///< @returns an LLSD Map of keyword -> replacement test pairs
+
+	/// Get the replacement for the keyword from the specified list
+	std::string replacementFor(std::string keyword, std::string listName);
+	
+	/// Adds a keywword/replacement pair to the named list
+	bool addEntryToList(LLWString keyword, LLWString replacement, std::string listName);
+
+	/// Removes the keywword and its replacement from the named list
+	bool removeEntryFromList(std::string keyword, std::string listName);
+
+	/** 
+	 * Look for currentWord in the lists in order, returning any substitution found
+	 * If no configured substitution is found, returns currentWord
+	 */
+	std::string replaceWord(const std::string currentWord /**< word to search for */ );
+
+	/// Provides a hard-coded example of settings 
+	LLSD getExampleLLSD();
+
+	/// Get the actual settings as LLSD
+	const LLSD& getAsLLSD();
+	///< @note for use only in AutoReplace::saveToUserSettings
+	
+  private:
+	/// Efficiently and safely compare list names 
+	bool listNameMatches( const LLSD& list, const std::string name );
+
+	/// The actual llsd data structure
+	LLSD mLists;
+
+	static const std::string AUTOREPLACE_LIST_NAME;    	 ///< key for looking up list names
+	static const std::string AUTOREPLACE_LIST_REPLACEMENTS; ///< key for looking up replacement map
+	
+    /**<
+	 * LLSD structure of the lists
+	 * - The configuration is an array (mLists),
+	 * - Each entry in the array is a replacement list
+	 * - Each replacement list is a map with three keys:
+	 * @verbatim  
+	 *     "name"    	  String    the name of the list
+	 *     "replacements" Map       keyword -> replacement pairs
+	 * 
+	 * <llsd>
+	 *   <array> 
+	 *     <map>
+	 *       <key>name</key>    <string>List 1</string>
+	 *       <key>data</key>
+	 *         <map>
+	 *           <key>keyword1</key>  <string>replacement1</string>
+	 *           <key>keyword2</key>  <string>replacement2</string>
+	 *    	   </map>
+	 *     </map> 
+	 *     <map>
+	 *       <key>name</key>    <string>List 2</string>
+	 *       <key>data</key>
+	 *         <map>
+	 *           <key>keyword1</key>  <string>replacement1</string>
+	 *           <key>keyword2</key>  <string>replacement2</string>
+	 *    	   </map>
+	 *     </map>
+	 *   </array> 
+	 * </llsd>
+	 * @endverbatim
+	 */
+};
+
+/** Provides a facility to auto-replace text dynamically as it is entered.
+ *
+ * When the end of a word is detected (defined as any punctuation character,
+ * or any whitespace except newline or return), the preceding word is used
+ * as a lookup key in an ordered list of maps.  If a match is found in any
+ * map, the keyword is replaced by the associated value from the map.
+ *
+ * See the autoreplaceCallback method for how to add autoreplace functionality
+ * to a text entry tool.
+ */
+class LLAutoReplace : public LLSingleton<LLAutoReplace>
+{
+  public:
+	LLAutoReplace();
+	~LLAutoReplace();
+
+	/// @return a pointer to the active instance
+	static LLAutoReplace* getInstance();
+
+	/// Callback that provides the hook for use in text entry methods
+	void autoreplaceCallback(LLUIString& inputText, S32& cursorPos);
+
+	/// Get a copy of the current settings
+	LLAutoReplaceSettings getSettings();
+
+	/// Commit new settings after making changes
+	void setSettings(const LLAutoReplaceSettings& settings);
+
+  private:
+	friend class LLSingleton<LLAutoReplace>;
+	static LLAutoReplace* sInstance; ///< the active settings instance
+
+	LLAutoReplaceSettings mSettings; ///< configuration information
+	
+	/// Read settings from persistent storage
+	void loadFromSettings();
+
+	/// Make the newSettings active and write them to user storage
+	void saveToUserSettings();
+
+	/// Compute the user settings file name
+	std::string getUserSettingsFileName();
+
+	/// Compute the (read-ony) application settings file name
+	std::string getAppSettingsFileName();
+
+	/// basename for the settings files
+	static const char* SETTINGS_FILE_NAME;
+};
+
+#endif /* LLAUTOREPLACE_H */
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
old mode 100755
new mode 100644
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 8986a694f9902585e6c443b62ddd2f84f538b198..4bf5b26b3b0794f213ee116d17f6fae3440bfcf1 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -59,6 +59,7 @@ LLFilePicker LLFilePicker::sInstance;
 #define RAW_FILTER L"RAW files (*.raw)\0*.raw\0"
 #define MODEL_FILTER L"Model files (*.dae)\0*.dae\0"
 #define SCRIPT_FILTER L"Script files (*.lsl)\0*.lsl\0"
+#define DICTIONARY_FILTER L"Dictionary files (*.dic; *.xcu)\0*.dic;*.xcu\0"
 #endif
 
 //
@@ -218,6 +219,10 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
 		mOFN.lpstrFilter = SCRIPT_FILTER \
 			L"\0";
 		break;
+	case FFLOAD_DICTIONARY:
+		mOFN.lpstrFilter = DICTIONARY_FILTER \
+			L"\0";
+		break;
 	default:
 		res = FALSE;
 		break;
@@ -643,6 +648,16 @@ Boolean LLFilePicker::navOpenFilterProc(AEDesc *theItem, void *info, void *callB
 								result = false;
 							}
 						}
+						else if (filter == FFLOAD_DICTIONARY)
+						{
+							if (fileInfo.filetype != 'DIC ' &&
+								fileInfo.filetype != 'XCU ' &&
+								(fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("dic"), kCFCompareCaseInsensitive) != kCFCompareEqualTo) &&
+								 fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("xcu"), kCFCompareCaseInsensitive) != kCFCompareEqualTo)))
+							{
+								result = false;
+							}
+						}
 						
 						if (fileInfo.extension)
 						{
@@ -1235,6 +1250,12 @@ static std::string add_script_filter_to_gtkchooser(GtkWindow *picker)
 							LLTrans::getString("script_files") + " (*.lsl)");
 }
 
+static std::string add_dictionary_filter_to_gtkchooser(GtkWindow *picker)
+{
+	return add_simple_mime_filter_to_gtkchooser(picker,  "text/plain",
+							LLTrans::getString("dictionary_files") + " (*.dic; *.xcu)");
+}
+
 BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename )
 {
 	BOOL rtn = FALSE;
@@ -1371,6 +1392,9 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
 		case FFLOAD_SCRIPT:
 			filtername = add_script_filter_to_gtkchooser(picker);
 			break;
+		case FFLOAD_DICTIONARY:
+			filtername = add_dictionary_filter_to_gtkchooser(picker);
+			break;
 		default:;
 			break;
 		}
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index a4d5d68ff58f51ddb93b15266de9856e5eaf492e..55c665b9c76a812efa9123d0826078d8a8291d24 100644
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -85,6 +85,7 @@ public:
 		FFLOAD_MODEL = 9,
 		FFLOAD_COLLADA = 10,
 		FFLOAD_SCRIPT = 11,
+		FFLOAD_DICTIONARY = 12
 	};
 
 	enum ESaveFilter
diff --git a/indra/newview/llfloaterautoreplacesettings.cpp b/indra/newview/llfloaterautoreplacesettings.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7d1bcba978a05a0257768b7edd31de57a02b58ba
--- /dev/null
+++ b/indra/newview/llfloaterautoreplacesettings.cpp
@@ -0,0 +1,641 @@
+/** 
+ * @file llfloaterautoreplacesettings.cpp
+ * @brief Auto Replace List floater
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterautoreplacesettings.h"
+
+#include "llagentdata.h"
+#include "llcommandhandler.h"
+#include "llfloater.h"
+#include "lluictrlfactory.h"
+#include "llagent.h"
+#include "llpanel.h"
+#include "llbutton.h"
+#include "llcolorswatch.h"
+#include "llcombobox.h"
+#include "llview.h"
+#include "llhttpclient.h"
+#include "llbufferstream.h"
+#include "llcheckboxctrl.h"
+#include "llviewercontrol.h"
+
+#include "llui.h"
+#include "llcontrol.h"
+#include "llscrollingpanellist.h"
+#include "llautoreplace.h"
+#include "llfilepicker.h"
+#include "llfile.h"
+#include "llsdserialize.h"
+#include "llsdutil.h"
+
+#include "llchat.h"
+#include "llinventorymodel.h"
+#include "llhost.h"
+#include "llassetstorage.h"
+#include "roles_constants.h"
+#include "llviewertexteditor.h"
+#include <boost/tokenizer.hpp>
+
+#include <iosfwd>
+#include "llfloaterreg.h"
+#include "llinspecttoast.h"
+#include "llnotificationhandler.h"
+#include "llnotificationmanager.h"
+#include "llnotificationsutil.h"
+
+
+LLFloaterAutoReplaceSettings::LLFloaterAutoReplaceSettings(const LLSD& key)
+ : LLFloater(key)
+ , mSelectedListName("")
+ , mListNames(NULL)
+ , mReplacementsList(NULL)
+ , mKeyword(NULL)
+ , mPreviousKeyword("")
+ , mReplacement(NULL)
+{
+}
+
+void LLFloaterAutoReplaceSettings::onClose(bool app_quitting)
+{
+	cleanUp();
+}
+
+BOOL LLFloaterAutoReplaceSettings::postBuild(void)
+{
+	// get copies of the current settings that we will operate on
+	mEnabled  = gSavedSettings.getBOOL("AutoReplace");
+	LL_DEBUGS("AutoReplace") << ( mEnabled ? "enabled" : "disabled") << LL_ENDL;
+
+	mSettings = LLAutoReplace::getInstance()->getSettings();
+	
+	// global checkbox for whether or not autoreplace is active
+	LLUICtrl* enabledCheckbox = getChild<LLUICtrl>("autoreplace_enable");
+	enabledCheckbox->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onAutoReplaceToggled, this));
+	enabledCheckbox->setValue(LLSD(mEnabled));
+
+	// top row list creation and deletion
+	getChild<LLUICtrl>("autoreplace_import_list")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onImportList,this));
+	getChild<LLUICtrl>("autoreplace_export_list")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onExportList,this));
+	getChild<LLUICtrl>("autoreplace_new_list")->setCommitCallback(   boost::bind(&LLFloaterAutoReplaceSettings::onNewList,this));
+	getChild<LLUICtrl>("autoreplace_delete_list")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onDeleteList,this));
+
+	// the list of keyword->replacement lists
+	mListNames = getChild<LLScrollListCtrl>("autoreplace_list_name");
+	mListNames->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onSelectList, this));
+	mListNames->setCommitOnSelectionChange(true);
+	
+	// list ordering
+	getChild<LLUICtrl>("autoreplace_list_up")->setCommitCallback(  boost::bind(&LLFloaterAutoReplaceSettings::onListUp,this));
+	getChild<LLUICtrl>("autoreplace_list_down")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onListDown,this));
+
+	// keyword->replacement entry add / delete
+	getChild<LLUICtrl>("autoreplace_add_entry")->setCommitCallback(   boost::bind(&LLFloaterAutoReplaceSettings::onAddEntry,this));
+	getChild<LLUICtrl>("autoreplace_delete_entry")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onDeleteEntry,this));
+
+	// entry edits
+	mKeyword     = getChild<LLLineEditor>("autoreplace_keyword");
+	mReplacement = getChild<LLLineEditor>("autoreplace_replacement");
+	getChild<LLUICtrl>("autoreplace_save_entry")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onSaveEntry, this));
+
+	// dialog termination ( Save Changes / Cancel )
+	getChild<LLUICtrl>("autoreplace_save_changes")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onSaveChanges, this));
+	getChild<LLUICtrl>("autoreplace_cancel")->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onCancel, this));
+
+	// the list of keyword->replacement pairs
+	mReplacementsList = getChild<LLScrollListCtrl>("autoreplace_list_replacements");
+	mReplacementsList->setCommitCallback(boost::bind(&LLFloaterAutoReplaceSettings::onSelectEntry, this));
+	mReplacementsList->setCommitOnSelectionChange(true);
+
+	center();
+
+	mSelectedListName.clear();
+	updateListNames();
+	updateListNamesControls();
+	updateReplacementsList();
+
+	return true;
+}
+
+
+void LLFloaterAutoReplaceSettings::updateListNames()
+{
+	mListNames->deleteAllItems(); // start from scratch
+
+	LLSD listNames = mSettings.getListNames(); // Array of Strings
+   
+	for ( LLSD::array_const_iterator entry = listNames.beginArray(), end = listNames.endArray();
+		  entry != end;
+		  ++entry
+		 )
+	{
+		const std::string& listName = entry->asString();
+		mListNames->addSimpleElement(listName);
+	}
+
+	if (!mSelectedListName.empty())
+	{
+		mListNames->setSelectedByValue( LLSD(mSelectedListName), true );
+	}
+}
+
+void LLFloaterAutoReplaceSettings::updateListNamesControls()
+{
+	if ( mSelectedListName.empty() )
+	{
+		// There is no selected list
+
+		// Disable all controls that operate on the selected list
+		getChild<LLButton>("autoreplace_export_list")->setEnabled(false);
+		getChild<LLButton>("autoreplace_delete_list")->setEnabled(false);
+		getChild<LLButton>("autoreplace_list_up")->setEnabled(false);
+		getChild<LLButton>("autoreplace_list_down")->setEnabled(false);
+
+		mReplacementsList->deleteAllItems();
+	}
+	else
+	{
+		// Enable the controls that operate on the selected list
+		getChild<LLButton>("autoreplace_export_list")->setEnabled(true);
+		getChild<LLButton>("autoreplace_delete_list")->setEnabled(true);
+		getChild<LLButton>("autoreplace_list_up")->setEnabled(!selectedListIsFirst());
+		getChild<LLButton>("autoreplace_list_down")->setEnabled(!selectedListIsLast());
+	}
+}
+
+void LLFloaterAutoReplaceSettings::onSelectList()
+{
+	std::string previousSelectedListName = mSelectedListName;
+	// only one selection allowed
+	LLSD selected = mListNames->getSelectedValue();
+	if (selected.isDefined())
+	{
+		mSelectedListName = selected.asString();
+		LL_DEBUGS("AutoReplace")<<"selected list '"<<mSelectedListName<<"'"<<LL_ENDL;
+	}
+	else
+	{
+		mSelectedListName.clear();
+		LL_DEBUGS("AutoReplace")<<"unselected"<<LL_ENDL;
+	}
+
+	updateListNamesControls();
+
+	if ( previousSelectedListName != mSelectedListName )
+	{
+		updateReplacementsList();
+	}
+}
+
+void LLFloaterAutoReplaceSettings::onSelectEntry()
+{
+    LLSD selectedRow = mReplacementsList->getSelectedValue();
+	if (selectedRow.isDefined())
+	{
+		mPreviousKeyword = selectedRow.asString();
+		LL_DEBUGS("AutoReplace")<<"selected entry '"<<mPreviousKeyword<<"'"<<LL_ENDL;	
+		mKeyword->setValue(selectedRow);
+		std::string replacement = mSettings.replacementFor(mPreviousKeyword, mSelectedListName );
+		mReplacement->setValue(replacement);
+		enableReplacementEntry();		
+		mReplacement->setFocus(true);
+	}
+	else
+	{
+		// no entry selection, so the entry panel should be off
+		disableReplacementEntry();		
+		LL_DEBUGS("AutoReplace")<<"no row selected"<<LL_ENDL;
+	}
+}
+
+void LLFloaterAutoReplaceSettings::updateReplacementsList()
+{
+	// start from scratch, since this should only be called when the list changes
+	mReplacementsList->deleteAllItems();
+
+	if ( mSelectedListName.empty() )
+	{
+		mReplacementsList->setEnabled(false);
+		getChild<LLButton>("autoreplace_add_entry")->setEnabled(false);
+		disableReplacementEntry();		
+	}
+	else
+	{
+		// Populate the keyword->replacement list from the selected list
+		const LLSD* mappings = mSettings.getListEntries(mSelectedListName);
+		for ( LLSD::map_const_iterator entry = mappings->beginMap(), end = mappings->endMap();
+			  entry != end;
+			  entry++
+			 )
+		{
+			LLSD row;
+			row["id"] = entry->first;
+			row["columns"][0]["column"] = "keyword";
+			row["columns"][0]["value"]  = entry->first;
+			row["columns"][1]["column"] = "replacement";
+			row["columns"][1]["value"]  = entry->second;
+
+			mReplacementsList->addElement(row, ADD_BOTTOM);
+		}
+
+		mReplacementsList->deselectAllItems(false /* don't call commit */);
+		mReplacementsList->setEnabled(true);
+
+		getChild<LLButton>("autoreplace_add_entry")->setEnabled(true);
+		disableReplacementEntry();		
+	}
+}
+
+void LLFloaterAutoReplaceSettings::enableReplacementEntry()
+{
+	LL_DEBUGS("AutoReplace")<<LL_ENDL;
+	mKeyword->setEnabled(true);
+	mReplacement->setEnabled(true);
+	getChild<LLButton>("autoreplace_save_entry")->setEnabled(true);
+	getChild<LLButton>("autoreplace_delete_entry")->setEnabled(true);
+}
+
+void LLFloaterAutoReplaceSettings::disableReplacementEntry()
+{
+	LL_DEBUGS("AutoReplace")<<LL_ENDL;
+	mPreviousKeyword.clear();
+	mKeyword->clear();
+	mKeyword->setEnabled(false);
+	mReplacement->clear();
+	mReplacement->setEnabled(false);
+	getChild<LLButton>("autoreplace_save_entry")->setEnabled(false);
+	getChild<LLButton>("autoreplace_delete_entry")->setEnabled(false);
+}
+
+// called when the global settings checkbox is changed
+void LLFloaterAutoReplaceSettings::onAutoReplaceToggled()
+{
+	// set our local copy of the flag, copied to the global preference in onOk
+	mEnabled = childGetValue("autoreplace_enable").asBoolean();
+	LL_DEBUGS("AutoReplace")<< "autoreplace_enable " << ( mEnabled ? "on" : "off" ) << LL_ENDL;
+}
+
+// called when the List Up button is pressed
+void LLFloaterAutoReplaceSettings::onListUp()
+{
+	S32 selectedRow = mListNames->getFirstSelectedIndex();
+	LLSD selectedName = mListNames->getSelectedValue().asString();
+
+	if ( mSettings.increaseListPriority(selectedName) )
+	{
+		updateListNames();
+		updateListNamesControls();
+	}
+	else
+	{
+		LL_WARNS("AutoReplace")
+			<< "invalid row ("<<selectedRow<<") selected '"<<selectedName<<"'"
+			<<LL_ENDL;
+	}
+}
+
+// called when the List Down button is pressed
+void LLFloaterAutoReplaceSettings::onListDown()
+{
+	S32 selectedRow = mListNames->getFirstSelectedIndex();
+	std::string selectedName = mListNames->getSelectedValue().asString();
+
+	if ( mSettings.decreaseListPriority(selectedName) )
+	{
+		updateListNames();
+		updateListNamesControls();
+	}
+	else
+	{
+		LL_WARNS("AutoReplace")
+			<< "invalid row ("<<selectedRow<<") selected '"<<selectedName<<"'"
+			<<LL_ENDL;
+	}
+}
+
+// called when the Delete Entry button is pressed
+void LLFloaterAutoReplaceSettings::onDeleteEntry()
+{
+    LLSD selectedRow = mReplacementsList->getSelectedValue();
+	if (selectedRow.isDefined())
+	{	
+		std::string keyword = selectedRow.asString();
+		mReplacementsList->deleteSelectedItems(); // delete from the control
+		mSettings.removeEntryFromList(keyword, mSelectedListName); // delete from the local settings copy
+		disableReplacementEntry(); // no selection active, so turn off the buttons
+	}
+}
+
+// called when the Import List button is pressed
+void LLFloaterAutoReplaceSettings::onImportList()
+{
+	LLFilePicker& picker = LLFilePicker::instance();
+	if( picker.getOpenFile( LLFilePicker::FFLOAD_XML) )
+	{
+		llifstream file;
+		file.open(picker.getFirstFile().c_str());
+		LLSD newList;
+		if (file.is_open())
+		{
+			LLSDSerialize::fromXMLDocument(newList, file);
+		}
+		file.close();
+
+		switch ( mSettings.addList(newList) )
+		{
+		case LLAutoReplaceSettings::AddListOk:
+			mSelectedListName = LLAutoReplaceSettings::getListName(newList);
+			
+			updateListNames();
+			updateListNamesControls();
+			updateReplacementsList();
+			break;
+
+		case LLAutoReplaceSettings::AddListDuplicateName:
+			{
+				std::string newName = LLAutoReplaceSettings::getListName(newList);
+				LL_WARNS("AutoReplace")<<"name '"<<newName<<"' is in use; prompting for new name"<<LL_ENDL;
+				LLSD newPayload;
+				newPayload["list"] = newList;
+				LLSD args;
+				args["DUPNAME"] = newName;
+	
+				LLNotificationsUtil::add("RenameAutoReplaceList", args, newPayload,
+										 boost::bind(&LLFloaterAutoReplaceSettings::callbackListNameConflict, this, _1, _2));
+			}
+			break;
+
+		case LLAutoReplaceSettings::AddListInvalidList:
+			LLNotificationsUtil::add("InvalidAutoReplaceList");
+			LL_WARNS("AutoReplace") << "imported list was invalid" << LL_ENDL;
+
+			mSelectedListName.clear();
+			updateListNames();
+			updateListNamesControls();
+			updateReplacementsList();
+			break;
+
+		default:
+			LL_ERRS("AutoReplace") << "invalid AddListResult" << LL_ENDL;
+
+		}
+		
+	}
+	else
+	{
+		LL_DEBUGS("AutoReplace") << "file selection failed for import list" << LL_ENDL;
+	}		
+}
+
+void LLFloaterAutoReplaceSettings::onNewList()
+{
+	LLSD payload;
+	LLSD emptyList;
+	LLAutoReplaceSettings::createEmptyList(emptyList);
+	payload["list"] = emptyList;
+    LLSD args;
+	
+	LLNotificationsUtil::add("AddAutoReplaceList", args, payload,
+							 boost::bind(&LLFloaterAutoReplaceSettings::callbackNewListName, this, _1, _2));
+}
+
+bool LLFloaterAutoReplaceSettings::callbackNewListName(const LLSD& notification, const LLSD& response)
+{
+	LL_DEBUGS("AutoReplace")<<"called"<<LL_ENDL;
+	
+	LLSD newList = notification["payload"]["list"];
+
+	if ( response.has("listname") && response["listname"].isString() )
+	{
+		std::string newName = response["listname"].asString();
+		LLAutoReplaceSettings::setListName(newList, newName);
+
+		switch ( mSettings.addList(newList) )
+		{
+		case LLAutoReplaceSettings::AddListOk:
+			LL_INFOS("AutoReplace") << "added new list '"<<newName<<"'"<<LL_ENDL;
+			mSelectedListName = newName;
+			updateListNames();
+			updateListNamesControls();
+			updateReplacementsList();
+			break;
+
+		case LLAutoReplaceSettings::AddListDuplicateName:
+			{
+				LL_WARNS("AutoReplace")<<"name '"<<newName<<"' is in use; prompting for new name"<<LL_ENDL;
+				LLSD newPayload;
+				newPayload["list"] = notification["payload"]["list"];
+				LLSD args;
+				args["DUPNAME"] = newName;
+	
+				LLNotificationsUtil::add("RenameAutoReplaceList", args, newPayload,
+										 boost::bind(&LLFloaterAutoReplaceSettings::callbackListNameConflict, this, _1, _2));
+			}
+			break;
+
+		case LLAutoReplaceSettings::AddListInvalidList:
+			LLNotificationsUtil::add("InvalidAutoReplaceList");
+
+			mSelectedListName.clear();
+			updateListNames();
+			updateListNamesControls();
+			updateReplacementsList();
+			break;
+
+		default:
+			LL_ERRS("AutoReplace") << "invalid AddListResult" << LL_ENDL;
+		}
+	}
+	else
+	{
+		LL_ERRS("AutoReplace") << "adding notification response" << LL_ENDL;
+	}
+	return false;
+}
+
+// callback for the RenameAutoReplaceList notification
+bool LLFloaterAutoReplaceSettings::callbackListNameConflict(const LLSD& notification, const LLSD& response)
+{
+	LLSD newList = notification["payload"]["list"];
+
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	switch ( option )
+	{
+	case 0:
+		// Replace current list
+		LL_INFOS("AutoReplace")<<"option 'replace current list' selected"<<LL_ENDL;
+		
+		break;
+
+	case 1:
+		// Use New Name
+		LL_INFOS("AutoReplace")<<"option 'use new name' selected"<<LL_ENDL;
+		callbackNewListName(notification, response);
+		break;
+
+	default:
+		LL_ERRS("AutoReplace")<<"invalid selected option "<<option<<LL_ENDL;
+	}
+
+	return false;
+}
+
+void LLFloaterAutoReplaceSettings::onDeleteList()
+{
+	std::string listName= mListNames->getFirstSelected()->getColumn(0)->getValue().asString();
+	mSettings.removeReplacementList(listName); // remove from the copy of settings
+	mReplacementsList->deleteSelectedItems();   // remove from the scrolling list
+
+	mSelectedListName.clear();
+	updateListNames();
+	updateListNamesControls();
+	updateReplacementsList();
+}
+
+void LLFloaterAutoReplaceSettings::onExportList()
+{
+	std::string listName=mListNames->getFirstSelected()->getColumn(0)->getValue().asString();
+	const LLSD* list = mSettings.exportList(listName);
+	std::string listFileName = listName + ".xml";
+	LLFilePicker& picker = LLFilePicker::instance();
+	if( picker.getSaveFile( LLFilePicker::FFSAVE_XML, listFileName) )
+	{
+		llofstream file;
+		file.open(picker.getFirstFile().c_str());
+		LLSDSerialize::toPrettyXML(*list, file);
+		file.close();
+	}
+}
+
+void LLFloaterAutoReplaceSettings::onAddEntry()
+{
+	mPreviousKeyword.clear();
+	mReplacementsList->deselectAllItems(false /* don't call commit */);
+	mKeyword->clear();
+	mReplacement->clear();
+	enableReplacementEntry();
+	mKeyword->setFocus(true);
+}
+
+void LLFloaterAutoReplaceSettings::onSaveEntry()
+{
+	LL_DEBUGS("AutoReplace")<<"called"<<LL_ENDL;
+	
+	if ( ! mPreviousKeyword.empty() )
+	{
+		// delete any existing value for the key that was editted
+		LL_INFOS("AutoReplace")
+			<< "list '" << mSelectedListName << "' "
+			<< "removed '" << mPreviousKeyword
+			<< "'" << LL_ENDL;
+		mSettings.removeEntryFromList( mPreviousKeyword, mSelectedListName );
+	}
+
+	LLWString keyword     = mKeyword->getWText();
+	LLWString replacement = mReplacement->getWText();
+	if ( mSettings.addEntryToList(keyword, replacement, mSelectedListName) )
+	{
+		// insert the new keyword->replacement pair
+		LL_INFOS("AutoReplace")
+			<< "list '" << mSelectedListName << "' "
+			<< "added '" << wstring_to_utf8str(keyword)
+			<< "' -> '" << wstring_to_utf8str(replacement)
+			<< "'" << LL_ENDL;
+
+		updateReplacementsList();
+	}
+	else
+	{
+		LLNotificationsUtil::add("InvalidAutoReplaceEntry");
+		LL_WARNS("AutoReplace")<<"invalid entry "
+							   << "keyword '" << wstring_to_utf8str(keyword)
+							   << "' replacement '" << wstring_to_utf8str(replacement)
+							   << "'" << LL_ENDL;
+	}
+}
+
+void LLFloaterAutoReplaceSettings::onCancel()
+{
+	cleanUp();
+	closeFloater(false /* not quitting */);
+}
+
+void LLFloaterAutoReplaceSettings::onSaveChanges()
+{
+	// put our local copy of the settings into the active copy
+	LLAutoReplace::getInstance()->setSettings( mSettings );
+	// save our local copy of the global feature enable/disable value
+	gSavedSettings.setBOOL("AutoReplace", mEnabled);
+	cleanUp();
+	closeFloater(false /* not quitting */);
+}
+
+void LLFloaterAutoReplaceSettings::cleanUp()
+{
+
+}
+
+bool LLFloaterAutoReplaceSettings::selectedListIsFirst()
+{
+	bool isFirst = false;
+	
+	if (!mSelectedListName.empty())
+	{
+		LLSD lists = mSettings.getListNames(); // an Array of Strings
+		LLSD first = lists.get(0);
+		if ( first.isString() && first.asString() == mSelectedListName )
+		{
+			isFirst = true;
+		}
+	}
+	return isFirst;
+}
+
+bool LLFloaterAutoReplaceSettings::selectedListIsLast()
+{
+	bool isLast = false;
+	
+	if (!mSelectedListName.empty())
+	{
+		LLSD last;
+		LLSD lists = mSettings.getListNames(); // an Array of Strings
+		for ( LLSD::array_const_iterator list = lists.beginArray(), listEnd = lists.endArray();
+			  list != listEnd;
+			  list++
+			 )
+		{
+			last = *list;
+		}
+		if ( last.isString() && last.asString() == mSelectedListName )
+		{
+			isLast = true;
+		}
+	}
+	return isLast;
+}
+
+/* TBD
+mOldText = getChild<LLLineEditor>("autoreplace_old_text");
+mNewText = getChild<LLLineEditor>("autoreplace_new_text");
+*/
diff --git a/indra/newview/llfloaterautoreplacesettings.h b/indra/newview/llfloaterautoreplacesettings.h
new file mode 100644
index 0000000000000000000000000000000000000000..629aea3e3ce8d955b43d5953583af36ace84a1ac
--- /dev/null
+++ b/indra/newview/llfloaterautoreplacesettings.h
@@ -0,0 +1,117 @@
+/** 
+ * @file llfloaterautoreplacesettings.h
+ * @brief Auto Replace List floater
+ * @copyright Copyright (c) 2011 LordGregGreg Back
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLFLOATERAUTOREPLACESETTINGS_H
+#define LLFLOATERAUTOREPLACESETTINGS_H
+
+#include "llfloater.h"
+#include "llmediactrl.h"
+#include "llscrolllistctrl.h"
+#include "lllineeditor.h"
+
+#include "llviewerinventory.h"
+#include <boost/bind.hpp>
+#include "llautoreplace.h"
+
+class LLFloaterAutoReplaceSettings : public LLFloater
+{
+public:
+	LLFloaterAutoReplaceSettings(const LLSD& key);
+
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onClose(bool app_quitting);
+
+	void setData(void * data);
+
+private:
+
+	/** @{ @name Local Copies of Settings
+	 * These are populated in the postBuild method with the values
+	 * current when the floater is instantiated, and then either
+	 * discarded when Cancel is pressed, or copied back to the active
+	 * settings if Ok is pressed.
+	 */
+	bool mEnabled; ///< the global preference for AutoReplace 
+	LLAutoReplaceSettings mSettings; ///< settings being modified
+	/** @} */
+	
+	/// convenience variable - the name of the currently selected list (if any)
+	std::string       mSelectedListName;
+	/// the scrolling list of list names (one column, no headings, order manually controlled)
+	LLScrollListCtrl* mListNames;
+	/// the scroling list of keyword->replacement pairs
+	LLScrollListCtrl* mReplacementsList;
+
+	/// the keyword for the entry editing pane
+	LLLineEditor*     mKeyword;
+	/// saved keyword value
+	std::string       mPreviousKeyword;
+	/// the replacement for the entry editing pane
+	LLLineEditor*     mReplacement;
+	
+	/// callback for when the feature enable/disable checkbox changes
+	void onAutoReplaceToggled();
+	/// callback for when an entry in the list of list names is selected
+	void onSelectList();
+
+	void onImportList();
+	void onExportList();
+	void onNewList();
+	void onDeleteList();
+
+	void onListUp();
+	void onListDown();
+
+	void onSelectEntry();
+	void onAddEntry();
+	void onDeleteEntry();
+	void onSaveEntry();
+
+	void onSaveChanges();
+	void onCancel();
+
+	/// updates the contents of the mListNames
+	void updateListNames();
+	/// updates the controls associated with mListNames (depends on whether a name is selected or not)
+	void updateListNamesControls();
+	/// updates the contents of the mReplacementsList
+	void updateReplacementsList();
+	/// enables the components that should only be active when a keyword is selected
+	void enableReplacementEntry();
+	/// disables the components that should only be active when a keyword is selected
+	void disableReplacementEntry();
+
+	/// called from the AddAutoReplaceList notification dialog
+	bool callbackNewListName(const LLSD& notification, const LLSD& response);
+	/// called from the RenameAutoReplaceList notification dialog
+	bool callbackListNameConflict(const LLSD& notification, const LLSD& response);
+
+	bool selectedListIsFirst();
+	bool selectedListIsLast();
+
+	void cleanUp();
+};
+
+#endif  // LLFLOATERAUTOREPLACESETTINGS_H
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index d6f5be9aaeac64e1fce5b41cd82a4a04334c4d02..5edd920c708b2bf9afe82bb7bdd2e0c97e377828 100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -35,7 +35,7 @@
 #include "llfloaterpreference.h"
 
 #include "message.h"
-
+#include "llfloaterautoreplacesettings.h"
 #include "llagent.h"
 #include "llavatarconstants.h"
 #include "llcheckboxctrl.h"
@@ -346,7 +346,9 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 	mCommitCallbackRegistrar.add("Pref.BlockList",				boost::bind(&LLFloaterPreference::onClickBlockList, this));
 	mCommitCallbackRegistrar.add("Pref.Proxy",					boost::bind(&LLFloaterPreference::onClickProxySettings, this));
 	mCommitCallbackRegistrar.add("Pref.TranslationSettings",	boost::bind(&LLFloaterPreference::onClickTranslationSettings, this));
-	
+	mCommitCallbackRegistrar.add("Pref.AutoReplace",            boost::bind(&LLFloaterPreference::onClickAutoReplace, this));
+	mCommitCallbackRegistrar.add("Pref.SpellChecker",           boost::bind(&LLFloaterPreference::onClickSpellChecker, this));
+
 	sSkin = gSavedSettings.getString("SkinCurrent");
 
 	mCommitCallbackRegistrar.add("Pref.ClickActionChange",				boost::bind(&LLFloaterPreference::onClickActionChange, this));
@@ -354,7 +356,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 	gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged,  _2));	
 	gSavedSettings.getControl("NameTagShowFriends")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged,  _2));	
 	gSavedSettings.getControl("UseDisplayNames")->getCommitSignal()->connect(boost::bind(&handleDisplayNamesOptionChanged,  _2));
-
+	
 	LLAvatarPropertiesProcessor::getInstance()->addObserver( gAgent.getID(), this );
 }
 
@@ -606,6 +608,9 @@ void LLFloaterPreference::cancel()
 	// hide translation settings floater
 	LLFloaterReg::hideInstance("prefs_translation");
 	
+	// hide translation settings floater
+	LLFloaterReg::hideInstance("prefs_autoreplace");
+	
 	// cancel hardware menu
 	LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings");
 	if (hardware_settings)
@@ -933,7 +938,6 @@ void LLFloaterPreference::refreshSkin(void* data)
 	self->getChild<LLRadioGroup>("skin_selection", true)->setValue(sSkin);
 }
 
-
 void LLFloaterPreference::buildPopupLists()
 {
 	LLScrollListCtrl& disabled_popups =
@@ -1517,6 +1521,16 @@ void LLFloaterPreference::onClickTranslationSettings()
 	LLFloaterReg::showInstance("prefs_translation");
 }
 
+void LLFloaterPreference::onClickAutoReplace()
+{
+	LLFloaterReg::showInstance("prefs_autoreplace");
+}
+
+void LLFloaterPreference::onClickSpellChecker()
+{
+		LLFloaterReg::showInstance("prefs_spellchecker");
+}
+
 void LLFloaterPreference::onClickActionChange()
 {
 	mClickActionDirty = true;
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index ec5994e91754afa5a071a478179dac2843b8e565..b71f7c647b180951ff144f4a8dc490ea13033eba 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -157,6 +157,8 @@ public:
 	void onClickBlockList();
 	void onClickProxySettings();
 	void onClickTranslationSettings();
+	void onClickAutoReplace();
+	void onClickSpellChecker();
 	void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
 	void getUIColor(LLUICtrl* ctrl, const LLSD& param);
 	
diff --git a/indra/newview/llfloaterspellchecksettings.cpp b/indra/newview/llfloaterspellchecksettings.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5ecdd1191813b9f202988479a57bd9694d19a86f
--- /dev/null
+++ b/indra/newview/llfloaterspellchecksettings.cpp
@@ -0,0 +1,491 @@
+/** 
+ * @file llfloaterspellchecksettings.h
+ * @brief Spell checker settings floater
+ *
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcombobox.h"
+#include "llfilepicker.h"
+#include "llfloaterreg.h"
+#include "llfloaterspellchecksettings.h"
+#include "llscrolllistctrl.h"
+#include "llsdserialize.h"
+#include "llspellcheck.h"
+#include "lltrans.h"
+#include "llviewercontrol.h"
+#include "llnotificationsutil.h"
+
+#include <boost/algorithm/string.hpp>
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterSpellCheckerSettings
+///----------------------------------------------------------------------------
+LLFloaterSpellCheckerSettings::LLFloaterSpellCheckerSettings(const LLSD& key)
+	: LLFloater(key)
+{
+}
+
+void LLFloaterSpellCheckerSettings::draw()
+{
+	LLFloater::draw();
+
+	std::vector<LLScrollListItem*> sel_items = getChild<LLScrollListCtrl>("spellcheck_available_list")->getAllSelected();
+	bool enable_remove = !sel_items.empty();
+	for (std::vector<LLScrollListItem*>::const_iterator sel_it = sel_items.begin(); sel_it != sel_items.end(); ++sel_it)
+	{
+		enable_remove &= LLSpellChecker::canRemoveDictionary((*sel_it)->getValue().asString());
+	}
+	getChild<LLUICtrl>("spellcheck_remove_btn")->setEnabled(enable_remove);
+}
+
+BOOL LLFloaterSpellCheckerSettings::postBuild(void)
+{
+	gSavedSettings.getControl("SpellCheck")->getSignal()->connect(boost::bind(&LLFloaterSpellCheckerSettings::refreshDictionaries, this, false));
+	LLSpellChecker::setSettingsChangeCallback(boost::bind(&LLFloaterSpellCheckerSettings::onSpellCheckSettingsChange, this));
+	getChild<LLUICtrl>("spellcheck_remove_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnRemove, this));
+	getChild<LLUICtrl>("spellcheck_import_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnImport, this));
+	getChild<LLUICtrl>("spellcheck_main_combo")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::refreshDictionaries, this, false));
+	getChild<LLUICtrl>("spellcheck_moveleft_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnMove, this, "spellcheck_active_list", "spellcheck_available_list"));
+	getChild<LLUICtrl>("spellcheck_moveright_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerSettings::onBtnMove, this, "spellcheck_available_list", "spellcheck_active_list"));
+	center();
+	return true;
+}
+
+void LLFloaterSpellCheckerSettings::onBtnImport()
+{
+	LLFloaterReg::showInstance("prefs_spellchecker_import");
+}
+
+void LLFloaterSpellCheckerSettings::onBtnMove(const std::string& from, const std::string& to)
+{
+	LLScrollListCtrl* from_ctrl = findChild<LLScrollListCtrl>(from);
+	LLScrollListCtrl* to_ctrl = findChild<LLScrollListCtrl>(to);
+
+	LLSD row;
+	row["columns"][0]["column"] = "name";
+
+	std::vector<LLScrollListItem*> sel_items = from_ctrl->getAllSelected();
+	std::vector<LLScrollListItem*>::const_iterator sel_it;
+	for ( sel_it = sel_items.begin(); sel_it != sel_items.end(); ++sel_it)
+	{
+		row["value"] = (*sel_it)->getValue();
+		row["columns"][0]["value"] = (*sel_it)->getColumn(0)->getValue();
+		to_ctrl->addElement(row);
+		to_ctrl->setSelectedByValue( (*sel_it)->getValue(), true );
+	}
+	from_ctrl->deleteSelectedItems();
+}
+
+void LLFloaterSpellCheckerSettings::onClose(bool app_quitting)
+{
+	if (app_quitting)
+	{
+		// don't save anything
+		return;
+	}
+	LLFloaterReg::hideInstance("prefs_spellchecker_import");
+	
+	std::list<std::string> list_dict;
+
+	LLComboBox* dict_combo = findChild<LLComboBox>("spellcheck_main_combo");
+	const std::string dict_name = dict_combo->getSelectedItemLabel();
+	if (!dict_name.empty())
+	{
+		list_dict.push_back(dict_name);
+
+		LLScrollListCtrl* list_ctrl = findChild<LLScrollListCtrl>("spellcheck_active_list");
+		std::vector<LLScrollListItem*> list_items = list_ctrl->getAllData();
+		for (std::vector<LLScrollListItem*>::const_iterator item_it = list_items.begin(); item_it != list_items.end(); ++item_it)
+		{
+			const std::string language = (*item_it)->getValue().asString();
+			if (LLSpellChecker::hasDictionary(language, true))
+			{
+				list_dict.push_back(language);
+			}
+		}
+	}
+	gSavedSettings.setString("SpellCheckDictionary", boost::join(list_dict, ","));
+}
+
+void LLFloaterSpellCheckerSettings::onOpen(const LLSD& key)
+{
+	refreshDictionaries(true);
+}
+
+void LLFloaterSpellCheckerSettings::onBtnRemove()
+{
+	std::vector<LLScrollListItem*> sel_items = getChild<LLScrollListCtrl>("spellcheck_available_list")->getAllSelected();
+	for (std::vector<LLScrollListItem*>::const_iterator sel_it = sel_items.begin(); sel_it != sel_items.end(); ++sel_it)
+	{
+		LLSpellChecker::instance().removeDictionary((*sel_it)->getValue().asString());
+	}
+}
+
+void LLFloaterSpellCheckerSettings::onSpellCheckSettingsChange()
+{
+	refreshDictionaries(true);
+}
+
+void LLFloaterSpellCheckerSettings::refreshDictionaries(bool from_settings)
+{
+	bool enabled = gSavedSettings.getBOOL("SpellCheck");
+	getChild<LLUICtrl>("spellcheck_moveleft_btn")->setEnabled(enabled);
+	getChild<LLUICtrl>("spellcheck_moveright_btn")->setEnabled(enabled);
+
+	// Populate the dictionary combobox
+	LLComboBox* dict_combo = findChild<LLComboBox>("spellcheck_main_combo");
+	std::string dict_cur = dict_combo->getSelectedItemLabel();
+	if ((dict_cur.empty() || from_settings) && (LLSpellChecker::getUseSpellCheck()))
+	{
+		dict_cur = LLSpellChecker::instance().getPrimaryDictionary();
+	}
+	dict_combo->clearRows();
+
+	const LLSD& dict_map = LLSpellChecker::getDictionaryMap();
+	if (dict_map.size())
+	{
+		for (LLSD::array_const_iterator dict_it = dict_map.beginArray(); dict_it != dict_map.endArray(); ++dict_it)
+		{
+			const LLSD& dict = *dict_it;
+			if ( (dict["installed"].asBoolean()) && (dict["is_primary"].asBoolean()) && (dict.has("language")) )
+			{
+				dict_combo->add(dict["language"].asString());
+			}
+		}
+		if (!dict_combo->selectByValue(dict_cur))
+		{
+			dict_combo->clear();
+		}
+	}
+	dict_combo->sortByName();
+	dict_combo->setEnabled(enabled);
+
+	// Populate the available and active dictionary list
+	LLScrollListCtrl* avail_ctrl = findChild<LLScrollListCtrl>("spellcheck_available_list");
+	LLScrollListCtrl* active_ctrl = findChild<LLScrollListCtrl>("spellcheck_active_list");
+
+	LLSpellChecker::dict_list_t active_list;
+	if ( ((!avail_ctrl->getItemCount()) && (!active_ctrl->getItemCount())) || (from_settings) )
+	{
+		if (LLSpellChecker::getUseSpellCheck())
+		{
+			active_list = LLSpellChecker::instance().getSecondaryDictionaries();
+		}
+	}
+	else
+	{
+		std::vector<LLScrollListItem*> active_items = active_ctrl->getAllData();
+		for (std::vector<LLScrollListItem*>::const_iterator item_it = active_items.begin(); item_it != active_items.end(); ++item_it)
+		{
+			std::string dict = (*item_it)->getValue().asString();
+			if (dict_cur != dict)
+			{
+				active_list.push_back(dict);
+			}
+		}
+	}
+
+	LLSD row;
+	row["columns"][0]["column"] = "name";
+
+	active_ctrl->clearRows();
+	active_ctrl->setEnabled(enabled);
+	for (LLSpellChecker::dict_list_t::const_iterator it = active_list.begin(); it != active_list.end(); ++it)
+	{
+		const std::string language = *it;
+		const LLSD dict = LLSpellChecker::getDictionaryData(language);
+		row["value"] = language;
+		row["columns"][0]["value"] = (!dict["user_installed"].asBoolean()) ? language : language + " " + LLTrans::getString("UserDictionary");
+		active_ctrl->addElement(row);
+	}
+	active_ctrl->sortByColumnIndex(0, true);
+	active_list.push_back(dict_cur);
+
+	avail_ctrl->clearRows();
+	avail_ctrl->setEnabled(enabled);
+	for (LLSD::array_const_iterator dict_it = dict_map.beginArray(); dict_it != dict_map.endArray(); ++dict_it)
+	{
+		const LLSD& dict = *dict_it;
+		const std::string language = dict["language"].asString();
+		if ( (dict["installed"].asBoolean()) && (active_list.end() == std::find(active_list.begin(), active_list.end(), language)) )
+		{
+			row["value"] = language;
+			row["columns"][0]["value"] = (!dict["user_installed"].asBoolean()) ? language : language + " " + LLTrans::getString("UserDictionary");
+			avail_ctrl->addElement(row);
+		}
+	}
+	avail_ctrl->sortByColumnIndex(0, true);
+}
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterSpellCheckerImport
+///----------------------------------------------------------------------------
+LLFloaterSpellCheckerImport::LLFloaterSpellCheckerImport(const LLSD& key)
+	: LLFloater(key)
+{
+}
+
+BOOL LLFloaterSpellCheckerImport::postBuild(void)
+{
+	getChild<LLUICtrl>("dictionary_path_browse")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerImport::onBtnBrowse, this));
+	getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerImport::onBtnOK, this));
+	getChild<LLUICtrl>("cancel_btn")->setCommitCallback(boost::bind(&LLFloaterSpellCheckerImport::onBtnCancel, this));
+	center();
+	return true;
+}
+
+void LLFloaterSpellCheckerImport::onBtnBrowse()
+{
+	LLFilePicker& file_picker = LLFilePicker::instance();
+	if (!file_picker.getOpenFile(LLFilePicker::FFLOAD_DICTIONARY))
+	{
+		return;
+	}
+
+	std::string filepath = file_picker.getFirstFile();
+
+	const std::string extension = gDirUtilp->getExtension(filepath);
+	if ("xcu" == extension)
+	{
+		filepath = parseXcuFile(filepath);
+		if (filepath.empty())
+		{
+			return;
+		}
+	}
+
+	getChild<LLUICtrl>("dictionary_path")->setValue(filepath);
+	
+	mDictionaryDir = gDirUtilp->getDirName(filepath);
+	mDictionaryBasename = gDirUtilp->getBaseFileName(filepath, true);
+	getChild<LLUICtrl>("dictionary_name")->setValue(mDictionaryBasename);
+}
+
+void LLFloaterSpellCheckerImport::onBtnCancel()
+{
+	closeFloater(false);
+}
+
+void LLFloaterSpellCheckerImport::onBtnOK()
+{
+	const std::string dict_dic = mDictionaryDir + gDirUtilp->getDirDelimiter() + mDictionaryBasename + ".dic";
+	const std::string dict_aff = mDictionaryDir + gDirUtilp->getDirDelimiter() + mDictionaryBasename + ".aff";
+	std::string dict_language = getChild<LLUICtrl>("dictionary_language")->getValue().asString();
+	LLStringUtil::trim(dict_language);
+
+	bool imported = false;
+	if (   dict_language.empty()
+		|| mDictionaryDir.empty()
+		|| mDictionaryBasename.empty()
+		|| ! gDirUtilp->fileExists(dict_dic)
+		)
+	{
+		LLNotificationsUtil::add("SpellingDictImportRequired");
+	}
+	else
+	{
+		std::string settings_dic = LLSpellChecker::getDictionaryUserPath() + mDictionaryBasename + ".dic";
+		if ( copyFile( dict_dic, settings_dic ) )
+		{
+			if (gDirUtilp->fileExists(dict_aff))
+			{
+				std::string settings_aff = LLSpellChecker::getDictionaryUserPath() + mDictionaryBasename + ".aff";
+				if (copyFile( dict_aff, settings_aff ))
+				{
+					imported = true;
+				}
+				else
+				{
+					LLSD args = LLSD::emptyMap();
+					args["FROM_NAME"] = dict_aff;
+					args["TO_NAME"] = settings_aff;
+					LLNotificationsUtil::add("SpellingDictImportFailed", args);
+				}
+			}
+			else
+			{
+				LLSD args = LLSD::emptyMap();
+				args["DIC_NAME"] = dict_dic;
+				LLNotificationsUtil::add("SpellingDictIsSecondary", args);
+
+				imported = true;
+			}
+		}
+		else
+		{
+			LLSD args = LLSD::emptyMap();
+			args["FROM_NAME"] = dict_dic;
+			args["TO_NAME"] = settings_dic;
+			LLNotificationsUtil::add("SpellingDictImportFailed", args);
+		}
+	}
+
+	if ( imported )
+	{
+		LLSD custom_dict_info;
+		custom_dict_info["is_primary"] = (bool)gDirUtilp->fileExists(dict_aff);
+		custom_dict_info["name"] = mDictionaryBasename;
+		custom_dict_info["language"] = dict_language;
+
+		LLSD custom_dict_map;
+		llifstream custom_file_in(LLSpellChecker::getDictionaryUserPath() + "user_dictionaries.xml");
+		if (custom_file_in.is_open())
+		{
+			LLSDSerialize::fromXMLDocument(custom_dict_map, custom_file_in);
+			custom_file_in.close();
+		}
+	
+		LLSD::array_iterator it = custom_dict_map.beginArray();
+		for (; it != custom_dict_map.endArray(); ++it)
+		{
+			LLSD& dict_info = *it;
+			if (dict_info["name"].asString() == mDictionaryBasename)
+			{
+				dict_info = custom_dict_info;
+				break;
+			}
+		}
+		if (custom_dict_map.endArray() == it)
+		{
+			custom_dict_map.append(custom_dict_info);
+		}
+
+		llofstream custom_file_out(LLSpellChecker::getDictionaryUserPath() + "user_dictionaries.xml", std::ios::trunc);
+		if (custom_file_out.is_open())
+		{
+			LLSDSerialize::toPrettyXML(custom_dict_map, custom_file_out);
+			custom_file_out.close();
+		}
+
+		LLSpellChecker::refreshDictionaryMap();
+	}
+
+	closeFloater(false);
+}
+
+bool LLFloaterSpellCheckerImport::copyFile(const std::string from, const std::string to)
+{
+	bool copied = false;
+	LLFILE* in = LLFile::fopen(from, "rb");		/* Flawfinder: ignore */	 	
+	if (in)	 	
+	{	 	
+		LLFILE* out = LLFile::fopen(to, "wb");		/* Flawfinder: ignore */
+		if (out)
+		{
+			char buf[16384];		/* Flawfinder: ignore */ 	
+			size_t readbytes;
+			bool write_ok = true;
+			while(write_ok && (readbytes = fread(buf, 1, 16384, in))) /* Flawfinder: ignore */
+			{
+				if (fwrite(buf, 1, readbytes, out) != readbytes)
+				{
+					LL_WARNS("SpellCheck") << "Short write" << LL_ENDL; 
+					write_ok = false;
+				}
+			}
+			if ( write_ok )
+			{
+				copied = true;
+			}
+			fclose(out);
+		}
+	}
+	fclose(in);
+	return copied;
+}
+
+std::string LLFloaterSpellCheckerImport::parseXcuFile(const std::string& file_path) const
+{
+	LLXMLNodePtr xml_root;
+	if ( (!LLUICtrlFactory::getLayeredXMLNode(file_path, xml_root)) || (xml_root.isNull()) )
+	{
+		return LLStringUtil::null;
+	}
+
+	// Bury down to the "Dictionaries" parent node
+	LLXMLNode* dict_node = NULL;
+	for (LLXMLNode* outer_node = xml_root->getFirstChild(); outer_node && !dict_node; outer_node = outer_node->getNextSibling())
+	{
+		std::string temp;
+		if ( (outer_node->getAttributeString("oor:name", temp)) && ("ServiceManager" == temp) )
+		{
+			for (LLXMLNode* inner_node = outer_node->getFirstChild(); inner_node && !dict_node; inner_node = inner_node->getNextSibling())
+			{
+				if ( (inner_node->getAttributeString("oor:name", temp)) && ("Dictionaries" == temp) )
+				{
+					dict_node = inner_node;
+					break;
+				}
+			}
+		}
+	}
+
+	if (dict_node)
+	{
+		// Iterate over all child nodes until we find one that has a <value>DICT_SPELL</value> node
+		for (LLXMLNode* outer_node = dict_node->getFirstChild(); outer_node; outer_node = outer_node->getNextSibling())
+		{
+			std::string temp;
+			LLXMLNodePtr location_node, format_node;
+			for (LLXMLNode* inner_node = outer_node->getFirstChild(); inner_node; inner_node = inner_node->getNextSibling())
+			{
+				if (inner_node->getAttributeString("oor:name", temp))
+				{
+					if ("Locations" == temp)
+					{
+						inner_node->getChild("value", location_node, false);
+					}
+					else if ("Format" == temp)
+					{
+						inner_node->getChild("value", format_node, false);
+					}
+				}
+			}
+			if ( (format_node.isNull()) || ("DICT_SPELL" != format_node->getValue()) || (location_node.isNull()) )
+			{
+				continue;
+			}
+
+			// Found a list of file locations, return the .dic (if present)
+			std::list<std::string> location_list;
+			boost::split(location_list, location_node->getValue(), boost::is_any_of(std::string(" ")));
+			for (std::list<std::string>::iterator it = location_list.begin(); it != location_list.end(); ++it)
+			{
+				std::string& location = *it;
+				if ("\\" != gDirUtilp->getDirDelimiter())
+					LLStringUtil::replaceString(location, "\\", gDirUtilp->getDirDelimiter());
+				else
+					LLStringUtil::replaceString(location, "/", gDirUtilp->getDirDelimiter());
+				LLStringUtil::replaceString(location, "%origin%", gDirUtilp->getDirName(file_path));
+				if ("dic" == gDirUtilp->getExtension(location))
+				{
+					return location;
+				}
+			}
+		}
+	}
+
+	return LLStringUtil::null;
+}
diff --git a/indra/newview/llfloaterspellchecksettings.h b/indra/newview/llfloaterspellchecksettings.h
new file mode 100644
index 0000000000000000000000000000000000000000..eded3a9133d0c8b751c34d3af31c878c80289ce3
--- /dev/null
+++ b/indra/newview/llfloaterspellchecksettings.h
@@ -0,0 +1,68 @@
+/** 
+ * @file llfloaterspellchecksettings.h
+ * @brief Spell checker settings floater
+ *
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLFLOATERSPELLCHECKERSETTINGS_H
+#define LLFLOATERSPELLCHECKERSETTINGS_H
+
+#include "llfloater.h"
+
+class LLFloaterSpellCheckerSettings : public LLFloater
+{
+public:
+	LLFloaterSpellCheckerSettings(const LLSD& key);
+
+	/*virtual*/ void draw();
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
+	/*virtual*/ void onClose(bool app_quitting);
+
+protected:
+	void onBtnImport();
+	void onBtnMove(const std::string& from, const std::string& to);
+	void onBtnRemove();
+	void onSpellCheckSettingsChange();
+	void refreshDictionaries(bool from_settings);
+};
+
+class LLFloaterSpellCheckerImport : public LLFloater
+{
+public:
+	LLFloaterSpellCheckerImport(const LLSD& key);
+
+	/*virtual*/ BOOL postBuild();
+
+protected:
+	void onBtnBrowse();
+	void onBtnCancel();
+	void onBtnOK();
+	bool copyFile(const std::string from, const std::string to);
+	std::string parseXcuFile(const std::string& file_path) const;
+
+	std::string mDictionaryDir;
+	std::string mDictionaryBasename;
+};
+
+#endif  // LLFLOATERSPELLCHECKERSETTINGS_H
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index f67464078b20d085aa6331608f69d1af2a8d6f32..63eedcdfeae4d849fcc2eaa3047c9d96c19a0cf3 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -56,7 +56,7 @@
 #include "llrootview.h"
 #include "llspeakers.h"
 #include "llviewerchat.h"
-
+#include "llautoreplace.h"
 
 LLIMFloater::LLIMFloater(const LLUUID& session_id)
   : LLTransientDockableFloater(NULL, true, session_id),
@@ -255,6 +255,8 @@ BOOL LLIMFloater::postBuild()
 	mInputEditor->setMaxTextLength(1023);
 	// enable line history support for instant message bar
 	mInputEditor->setEnableLineHistory(TRUE);
+	// *TODO Establish LineEditor with autoreplace callback
+	mInputEditor->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2));
 
 	LLFontGL* font = LLViewerChat::getChatFont();
 	mInputEditor->setFont(font);	
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
old mode 100755
new mode 100644
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 00ff81724cc12efd307a9715a102e1e1787b1326..f8f0f7d243688c497783935dfbe5cd052a4a67c2 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -52,6 +52,7 @@
 #include "lltranslate.h"
 
 #include "llresizehandle.h"
+#include "llautoreplace.h"
 
 S32 LLNearbyChatBar::sLastSpecialChatChannel = 0;
 
@@ -89,6 +90,7 @@ BOOL LLNearbyChatBar::postBuild()
 {
 	mChatBox = getChild<LLLineEditor>("chat_box");
 
+	mChatBox->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2));
 	mChatBox->setCommitCallback(boost::bind(&LLNearbyChatBar::onChatBoxCommit, this));
 	mChatBox->setKeystrokeCallback(&onChatBoxKeystroke, this);
 	mChatBox->setFocusLostCallback(boost::bind(&onChatBoxFocusLost, _1, this));
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 50e50ce63a8fb519a69a044bb4a7cce36703b1d9..ee7a234bbe8b4a869eab2d765ecef487d6eaec4a 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -740,6 +740,7 @@ bool idle_startup()
 		{
 			display_startup();
 			initialize_edit_menu();
+			initialize_spellcheck_menu();
 			display_startup();
 			init_menus();
 			display_startup();
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index e5d75c9f9f526702485a73a8f84ce38afd2361da..2b4628ea2eb599e0f8ac1653bad274200caed2f7 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -71,8 +71,12 @@
 #include "llpaneloutfitsinventory.h"
 #include "llpanellogin.h"
 #include "llpaneltopinfobar.h"
+#include "llspellcheck.h"
 #include "llupdaterservice.h"
 
+// Third party library includes
+#include <boost/algorithm/string.hpp>
+
 #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
 BOOL 				gHackGodmode = FALSE;
 #endif
@@ -492,6 +496,25 @@ bool handleForceShowGrid(const LLSD& newvalue)
 	return true;
 }
 
+bool handleSpellCheckChanged()
+{
+	if (gSavedSettings.getBOOL("SpellCheck"))
+	{
+		std::list<std::string> dict_list;
+		std::string dict_setting = gSavedSettings.getString("SpellCheckDictionary");
+		boost::split(dict_list, dict_setting, boost::is_any_of(std::string(",")));
+		if (!dict_list.empty())
+		{
+			LLSpellChecker::setUseSpellCheck(dict_list.front());
+			dict_list.pop_front();
+			LLSpellChecker::instance().setSecondaryDictionaries(dict_list);
+			return true;
+		}
+	}
+	LLSpellChecker::setUseSpellCheck(LLStringUtil::null);
+	return true;
+}
+
 bool toggle_agent_pause(const LLSD& newvalue)
 {
 	if ( newvalue.asBoolean() )
@@ -696,6 +719,8 @@ void settings_setup_listeners()
 	gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(boost::bind(&toggle_updater_service_active, _2));
 	gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2));
 	gSavedSettings.getControl("RenderTransparentWater")->getSignal()->connect(boost::bind(&handleRenderTransparentWaterChanged, _2));
+	gSavedSettings.getControl("SpellCheck")->getSignal()->connect(boost::bind(&handleSpellCheckChanged));
+	gSavedSettings.getControl("SpellCheckDictionary")->getSignal()->connect(boost::bind(&handleSpellCheckChanged));
 }
 
 #if TEST_CACHED_CONTROL
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index affea90a15b864c8eba21979a9d88a942f78fa68..96303151f4eb9aca72aab75550ac82fbd2b1817f 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -30,7 +30,7 @@
 #include "llfloaterreg.h"
 
 #include "llviewerfloaterreg.h"
-
+#include "llfloaterautoreplacesettings.h"
 #include "llcompilequeue.h"
 #include "llcallfloater.h"
 #include "llfasttimerview.h"
@@ -99,6 +99,7 @@
 #include "llfloatersidepanelcontainer.h"
 #include "llfloatersnapshot.h"
 #include "llfloatersounddevices.h"
+#include "llfloaterspellchecksettings.h"
 #include "llfloatertelehub.h"
 #include "llfloatertestinspectors.h"
 #include "llfloatertestlistview.h"
@@ -253,7 +254,10 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
 	LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);
 	LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>);
+	LLFloaterReg::add("prefs_spellchecker_import", "floater_spellcheck_import.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSpellCheckerImport>);
 	LLFloaterReg::add("prefs_translation", "floater_translation_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTranslationSettings>);
+	LLFloaterReg::add("prefs_spellchecker", "floater_spellcheck.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSpellCheckerSettings>);
+	LLFloaterReg::add("prefs_autoreplace", "floater_autoreplace.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAutoReplaceSettings>);
 	LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerms>);
 	LLFloaterReg::add("picks", "floater_picks.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
 	LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index b92354dcf4b5a77b019cb2ce1201e3d20311fc03..97ddfb48d2df34d46480d3dbcc6ced74fbe82bf3 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -86,6 +86,7 @@
 #include "llrootview.h"
 #include "llsceneview.h"
 #include "llselectmgr.h"
+#include "llspellcheckmenuhandler.h"
 #include "llstatusbar.h"
 #include "lltextureview.h"
 #include "lltoolcomp.h"
@@ -2021,7 +2022,6 @@ class LLAdvancedCompressImage : public view_listener_t
 };
 
 
-
 /////////////////////////
 // SHOW DEBUG SETTINGS //
 /////////////////////////
@@ -5104,6 +5104,78 @@ class LLEditDelete : public view_listener_t
 	}
 };
 
+void handle_spellcheck_replace_with_suggestion(const LLUICtrl* ctrl, const LLSD& param)
+{
+	const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
+	LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+	if ( (!spellcheck_handler) || (!spellcheck_handler->getSpellCheck()) )
+	{
+		return;
+	}
+
+	U32 index = 0;
+	if ( (!LLStringUtil::convertToU32(param.asString(), index)) || (index >= spellcheck_handler->getSuggestionCount()) )
+	{
+		return;
+	}
+
+	spellcheck_handler->replaceWithSuggestion(index);
+}
+
+bool visible_spellcheck_suggestion(LLUICtrl* ctrl, const LLSD& param)
+{
+	LLMenuItemGL* item = dynamic_cast<LLMenuItemGL*>(ctrl);
+	const LLContextMenu* menu = (item) ? dynamic_cast<const LLContextMenu*>(item->getParent()) : NULL;
+	const LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<const LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+	if ( (!spellcheck_handler) || (!spellcheck_handler->getSpellCheck()) )
+	{
+		return false;
+	}
+
+	U32 index = 0;
+	if ( (!LLStringUtil::convertToU32(param.asString(), index)) || (index >= spellcheck_handler->getSuggestionCount()) )
+	{
+		return false;
+	}
+
+	item->setLabel(spellcheck_handler->getSuggestion(index));
+	return true;
+}
+
+void handle_spellcheck_add_to_dictionary(const LLUICtrl* ctrl)
+{
+	const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
+	LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+	if ( (spellcheck_handler) && (spellcheck_handler->canAddToDictionary()) )
+	{
+		spellcheck_handler->addToDictionary();
+	}
+}
+
+bool enable_spellcheck_add_to_dictionary(const LLUICtrl* ctrl)
+{
+	const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
+	const LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<const LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+	return (spellcheck_handler) && (spellcheck_handler->canAddToDictionary());
+}
+
+void handle_spellcheck_add_to_ignore(const LLUICtrl* ctrl)
+{
+	const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
+	LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+	if ( (spellcheck_handler) && (spellcheck_handler->canAddToIgnore()) )
+	{
+		spellcheck_handler->addToIgnore();
+	}
+}
+
+bool enable_spellcheck_add_to_ignore(const LLUICtrl* ctrl)
+{
+	const LLContextMenu* menu = dynamic_cast<const LLContextMenu*>(ctrl->getParent());
+	const LLSpellCheckMenuHandler* spellcheck_handler = (menu) ? dynamic_cast<const LLSpellCheckMenuHandler*>(menu->getSpawningView()) : NULL;
+	return (spellcheck_handler) && (spellcheck_handler->canAddToIgnore());
+}
+
 bool enable_object_delete()
 {
 	bool new_value = 
@@ -8053,6 +8125,19 @@ void initialize_edit_menu()
 
 }
 
+void initialize_spellcheck_menu()
+{
+	LLUICtrl::CommitCallbackRegistry::Registrar& commit = LLUICtrl::CommitCallbackRegistry::currentRegistrar();
+	LLUICtrl::EnableCallbackRegistry::Registrar& enable = LLUICtrl::EnableCallbackRegistry::currentRegistrar();
+
+	commit.add("SpellCheck.ReplaceWithSuggestion", boost::bind(&handle_spellcheck_replace_with_suggestion, _1, _2));
+	enable.add("SpellCheck.VisibleSuggestion", boost::bind(&visible_spellcheck_suggestion, _1, _2));
+	commit.add("SpellCheck.AddToDictionary", boost::bind(&handle_spellcheck_add_to_dictionary, _1));
+	enable.add("SpellCheck.EnableAddToDictionary", boost::bind(&enable_spellcheck_add_to_dictionary, _1));
+	commit.add("SpellCheck.AddToIgnore", boost::bind(&handle_spellcheck_add_to_ignore, _1));
+	enable.add("SpellCheck.EnableAddToIgnore", boost::bind(&enable_spellcheck_add_to_ignore, _1));
+}
+
 void initialize_menus()
 {
 	// A parameterized event handler used as ctrl-8/9/0 zoom controls below.
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 87cb4efbc44fd2411f550bd76b320d8af6518773..8c40762865ea1b781198f41652112b0609a060a4 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -39,6 +39,7 @@ class LLObjectSelection;
 class LLSelectNode;
 
 void initialize_edit_menu();
+void initialize_spellcheck_menu();
 void init_menus();
 void cleanup_menus();
 
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index eabcc68916b11c30954c2e92d4c911f31dc09abf..7ca6820318ba3c96857760a0a14b320455163da3 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -54,6 +54,8 @@ with the same filename but different name
 
   <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png"	preload="true" />
   <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
+  <texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" />
+  <texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" />
 
   <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
   <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Left.png b/indra/newview/skins/default/textures/widgets/Arrow_Left.png
new file mode 100644
index 0000000000000000000000000000000000000000..a424282839c8d9c71d3785ae2ba4badccf0455db
Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/Arrow_Left.png differ
diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Right.png b/indra/newview/skins/default/textures/widgets/Arrow_Right.png
new file mode 100644
index 0000000000000000000000000000000000000000..e32bee8f344c989aad93c36bab229a2d5f03e3c6
Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/Arrow_Right.png differ
diff --git a/indra/newview/skins/default/xui/en/floater_autoreplace.xml b/indra/newview/skins/default/xui/en/floater_autoreplace.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0bfefc8abe36e9a9723b940c90cb3a6b6e6cb8cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_autoreplace.xml
@@ -0,0 +1,289 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ border="true"
+ can_close="true"
+ can_minimize="true"
+ can_resize="false"
+ help_topic="autoreplace_settings"
+ save_rect="true"
+ height="455"
+ width="490"
+ name="autoreplace_floater"
+ title="Auto-Replace Settings">
+  <check_box
+   bottom_delta="30"
+   left_delta="15"
+   height="16"
+   width="100"
+   follows="left|top"
+   label="Enable Auto-Replace"
+   name="autoreplace_enable"
+   tool_tip="As you enter chat text, replace any of the keywords entered with the corresponding replacement"/>
+  <view_border
+   top_pad="15"
+   left="2"
+   height="0"
+   width="491"
+   follows="left|top"
+   bevel_style="none"
+   border_thickness="1"
+   mouse_opaque="false"
+   name="divisor1"/>
+  <button
+   top_pad="10"
+   left="10"
+   height="22"
+   width="110"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="autoreplace_import_list"
+   label="Import List..."
+   tool_tip="Load a previously exported list from a file."/>
+  <button
+   top_delta="0"
+   left_pad="10"
+   height="22"
+   width="110"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="autoreplace_export_list"
+   label="Export List..."
+   tool_tip="Save the selected list to a file so you can share it."/>
+  <button
+   top_delta="0"
+   left_pad="10"
+   height="22"
+   width="110"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="autoreplace_new_list"
+   label="New List..."
+   tool_tip="Create a new list."/>
+  <button
+   top_delta="0"
+   left_pad="10"
+   height="22"
+   width="110"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="autoreplace_delete_list"
+   label="Delete List"
+   tool_tip="Delete the selected list."/>
+  <scroll_list
+   top_pad="10"
+   left="10"
+   height="100"
+   width="370"
+   follows="left|top"
+   column_padding="0"
+   draw_heading="false"
+   multi_select="false"
+   name="autoreplace_list_name"
+   search_column="0">
+  </scroll_list>
+  <button
+   top_delta="23"
+   left_pad="10"
+   height="22"
+   width="90"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="autoreplace_list_up"
+   image_overlay="Arrow_Up"
+   tool_tip="Move this list up in priority."/>
+  <button
+   top_pad="10"
+   left_delta="0"
+   height="22"
+   width="90"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="autoreplace_list_down"
+   image_overlay="Arrow_Down"
+   tool_tip="Move this list down in priority."/>
+  <view_border
+   top_pad="36"
+   left="2"
+   height="0"
+   width="491"
+   follows="left|top"
+   bevel_style="none"
+   border_thickness="1"
+   mouse_opaque="false"
+   name="divisor2"/>
+  <scroll_list
+   top_pad="10"
+   left="10"
+   height="120"
+   width="370"
+   follows="left|top"
+   column_padding="0"
+   draw_heading="true"
+   multi_select="true"
+   name="autoreplace_list_replacements"
+   search_column="0">
+    <scroll_list.columns
+        label="Keyword"
+        name="keyword"
+        relative_width="0.30" />
+    <scroll_list.columns
+        label="Replacement"
+        name="replacement"
+        relative_width="0.70" />
+  </scroll_list>
+  <button
+   top_delta="41"
+   left_pad="10"
+   height="22"
+   width="90"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="autoreplace_add_entry"
+   label="Add..."/>
+  <button 
+   top_pad="10"
+   left_delta="0"
+   height="22"
+   width="90"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="autoreplace_delete_entry"
+   label="Remove"/>
+  <view_border
+   top_pad="38"
+   left="2"
+   height="0"
+   width="491"
+   follows="left|top"
+   bevel_style="none"
+   border_thickness="1"
+   mouse_opaque="false"
+   name="divisor3"/>
+  <text
+   type="string"
+   follows="left|top"
+   height="16"
+   layout="topleft"
+   left="10"
+   top_pad="13"
+   width="50">
+   Keyword:
+  </text>
+  <line_editor
+   name="autoreplace_keyword"
+   follows="left|top"
+   height="23"
+   layout="topleft"
+   left="100"
+   max_length_bytes="255"
+   top_delta="-5"
+   width="150"
+   />
+  <text
+   type="string"
+   follows="left|top"
+   height="16"
+   layout="topleft"
+   left="10"
+   right="90"
+   top_pad="10"
+   >
+   Replacement:
+  </text>
+  <line_editor
+   name="autoreplace_replacement"
+   follows="left|top"
+   height="23"
+   layout="topleft"
+   left="100"
+   max_length_bytes="255"
+   top_delta="-5"
+   width="280"
+   />
+  <button
+   top_delta="0"
+   right="-10"
+   height="22"
+   width="90"
+   enabled="false"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="autoreplace_save_entry"
+   label="Save Entry"
+   tool_tip="Save this entry."/>
+  <view_border
+   top_pad="10"
+   left="2"
+   height="0"
+   width="491"
+   follows="left|top"
+   bevel_style="none"
+   border_thickness="1"
+   mouse_opaque="false"
+   name="divisor4"/>
+  <button
+   top_pad="10"
+   right="380"
+   height="22"
+   width="90"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="autoreplace_save_changes"
+   label="Save Changes"
+   tool_tip="Save all changes."/>
+  <button
+   top_delta="0"
+   right="480"
+   height="22"
+   width="90"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="autoreplace_cancel"
+   label="Cancel"
+   tool_tip="Discard all changes."/>
+</floater>
+<!--
+  <text 
+   top_pad="10"
+   left="10"
+   height="16"
+   width="260"
+   follows="left|top"
+   halign="center"
+   mouse_opaque="true"
+   name="autoreplace_text2">
+    Entries
+  </text>
+-->
diff --git a/indra/newview/skins/default/xui/en/floater_chat_bar.xml b/indra/newview/skins/default/xui/en/floater_chat_bar.xml
index 688a01ce7bc2d05a8b43a0ef906a73509c312bf3..405557242fa8c47465c5d6bf828a98b02f120fd4 100644
--- a/indra/newview/skins/default/xui/en/floater_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/floater_chat_bar.xml
@@ -46,6 +46,7 @@
         left="0"
         max_length_bytes="1023"
         name="chat_box"
+        spellcheck="true"
         text_pad_left="5"
         text_pad_right="25"
         tool_tip="Press Enter to say, Ctrl+Enter to shout"
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 82014e883649d1b6c852655b6fc0219609dcfc44..040b66623e72940042b0416980bf838890a5fc15 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -84,6 +84,7 @@
          label="To"
          layout="bottomleft"
          name="chat_editor"
+         spellcheck="true"
          tab_group="3"
          width="236">
         </line_editor>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
index be3b2d179d5155acaf9a359baac3dc9498a7a6d9..2e1c8ce6707354e69c065b7f5b4a779aadc76ea3 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
@@ -70,6 +70,7 @@
      max_length="65536"
      name="Notecard Editor"
      parse_urls="false" 
+     spellcheck="true"
      tab_group="1"
      top="46"
      width="392"
diff --git a/indra/newview/skins/default/xui/en/floater_spellcheck.xml b/indra/newview/skins/default/xui/en/floater_spellcheck.xml
new file mode 100644
index 0000000000000000000000000000000000000000..76a350dd294729e73dfa72559a2c26c3e730ba45
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_spellcheck.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ border="true"
+ can_close="true"
+ can_minimize="true"
+ save_rect="true"
+ help_topic="spelling_settings"
+ can_resize="false"
+ height="315"
+ width="490"
+ name="spellcheck_floater"
+ title="Spell Checker Settings">
+  <check_box
+   bottom_delta="30"
+   control_name="SpellCheck"
+   left_delta="15"
+   height="16"
+   width="100"
+   follows="left|top"
+   label="Enable spell checker"
+   name="spellcheck_enable" />
+  <view_border
+   top_pad="10"
+   left="2"
+   height="0"
+   width="491"
+   follows="left|top"
+   bevel_style="none"
+   border_thickness="1"
+   mouse_opaque="false"
+   name="divisor1"/>
+  <text
+   enabled_control="SpellCheck"
+   follows="top|left"
+   height="10"
+   layout="topleft"
+   left="38"
+   mouse_opaque="false"
+   name="spellcheck_main"
+   top_pad="15"
+   type="string"
+   width="90"
+  >
+    Main dictionary :
+  </text>
+  <combo_box
+   enabled_control="SpellCheck"
+   follows="top|left"
+   height="23"
+   layout="topleft"
+   left_pad="10"
+   name="spellcheck_main_combo"
+   top_pad="-15"
+   width="175"
+  />
+  <text
+   enabled_control="SpellCheck"
+   follows="top|left"
+   height="10"
+   label="Logs:"
+   layout="topleft"
+   left="38"
+   mouse_opaque="false"
+   name="spellcheck_additional"
+   top_pad="15"
+   type="string"
+   width="190"
+  >
+    Additional dictionaries :
+  </text>
+  <text
+   follows="top|left"
+   height="12"
+   layout="topleft"
+   left="55"
+   length="1"
+   name="spellcheck_available"
+   top_pad="10"
+   type="string"
+   width="175">
+      Available
+  </text>
+  <text
+   follows="top|left"
+   height="12"
+   type="string"
+   left_pad="45"
+   length="1"
+   layout="topleft"
+   name="spellcheck_active"
+   width="175">
+      Active
+  </text>
+  <scroll_list
+   enabled_control="SpellCheck"
+   follows="top|left"
+   height="155"
+   layout="topleft"
+   left="55"
+   multi_select="true"
+   name="spellcheck_available_list"
+   sort_column="0"
+   sort_ascending="true" 
+   width="175" />
+  <button
+   enabled_control="SpellCheck"
+   follows="top|left"
+   height="26"
+   image_overlay="Arrow_Right"
+   hover_glow_amount="0.15"
+   layout="topleft"
+   left_pad="10"
+   name="spellcheck_moveright_btn"
+   top_delta="50"
+   width="25">
+  </button>
+  <button
+   enabled_control="SpellCheck"
+   follows="top|left"
+   height="26"
+   image_overlay="Arrow_Left"
+   hover_glow_amount="0.15"
+   layout="topleft"
+   name="spellcheck_moveleft_btn"
+   top_delta="30"
+   width="25">
+  </button>
+  <scroll_list
+   enabled_control="SpellCheck"
+   follows="top|left"
+   height="155"
+   layout="topleft"
+   left_pad="10"
+   multi_select="true"
+   name="spellcheck_active_list"
+   sort_column="0"
+   sort_ascending="true" 
+   top_pad="-105"
+   width="175"
+  />
+  <button
+   enabled="false"
+   follows="left|top"
+   height="23"
+   label="Remove"
+   layout="topleft"
+   left="55"
+   name="spellcheck_remove_btn"
+   top_pad="5"
+   width="80" />
+  <button
+   follows="left|top"
+   height="23"
+   label="Import..."
+   layout="topleft"
+   left_pad="15"
+   name="spellcheck_import_btn"
+   top_delta="0"
+   width="80" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_spellcheck_import.xml b/indra/newview/skins/default/xui/en/floater_spellcheck_import.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b54090015d62f85874caef7e283dbbe6f86456a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_spellcheck_import.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ border="true"
+ can_close="true"
+ can_minimize="true"
+ bottom="275"
+ left="300"
+ can_resize="false"
+ height="140"
+ width="400"
+ name="spellcheck_import"
+ title="Import Dictionary">
+  <text
+   follows="top|left"
+   height="16"
+   layout="topleft"
+   left="25"
+   top="15"
+   type="string"
+   width="65">
+   Dictionary:
+  </text>
+  <line_editor
+   enabled="false"
+   follows="left|top"
+   height="23"
+   layout="topleft"
+   left_pad="10"
+   max_length_bytes="255"
+   name="dictionary_path"
+   top_delta="-5"
+   width="200" />
+  <button
+   follows="left|top"
+   height="23"
+   label="Browse"
+   label_selected="Browse"
+   layout="topleft"
+   left_pad="5"
+   name="dictionary_path_browse"
+   top_delta="0"
+   width="75" />
+  <text
+   follows="top|left"
+   height="16"
+   layout="topleft"
+   left="25"
+   top_pad="8"
+   type="string"
+   width="65">
+   Name:
+  </text>
+  <line_editor
+   enabled="false"
+   follows="left|top"
+   height="23"
+   layout="topleft"
+   left_pad="10"
+   max_length_bytes="255"
+   name="dictionary_name"
+   top_delta="-5"
+   width="200" />
+  <text
+   follows="top|left"
+   height="16"
+   layout="topleft"
+   left="25"
+   top_pad="8"
+   type="string"
+   width="65">
+   Language:
+  </text>
+  <line_editor
+   follows="left|top"
+   height="23"
+   layout="topleft"
+   left_pad="10"
+   max_length_bytes="255"
+   name="dictionary_language"
+   top_delta="-5"
+   width="200" />
+  <view_border
+   top_pad="10"
+   left="2"
+   height="0"
+   width="396"
+   follows="left|top"
+   bevel_style="none"
+   border_thickness="1"
+   mouse_opaque="false"
+   name="divisor"/>
+  <button
+   top_pad="10"
+   right="280"
+   height="22"
+   width="90"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="ok_btn"
+   label="Import" />
+  <button
+   top_delta="0"
+   right="380"
+   height="22"
+   width="90"
+   enabled="true"
+   follows="left|top"
+   mouse_opaque="true"
+   halign="center"
+   scale_image="true"
+   name="cancel_btn"
+   label="Cancel" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/menu_text_editor.xml b/indra/newview/skins/default/xui/en/menu_text_editor.xml
index fe8489166b927c9a490bf6b189b79a279797a27b..70b40dd89b4cd09aac8b503b2ae7d9bea7e4292e 100644
--- a/indra/newview/skins/default/xui/en/menu_text_editor.xml
+++ b/indra/newview/skins/default/xui/en/menu_text_editor.xml
@@ -1,6 +1,85 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <context_menu
  name="Text editor context menu">
+  <menu_item_call
+   label="(unknown)"
+   layout="topleft"
+   name="Suggestion 1">
+    <menu_item_call.on_click
+     function="SpellCheck.ReplaceWithSuggestion"
+     parameter="0" />
+    <menu_item_call.on_visible
+     function="SpellCheck.VisibleSuggestion"
+     parameter="0" />
+  </menu_item_call>
+  <menu_item_call
+   label="(unknown)"
+   layout="topleft"
+   name="Suggestion 2">
+    <menu_item_call.on_click
+     function="SpellCheck.ReplaceWithSuggestion"
+     parameter="1" />
+    <menu_item_call.on_visible
+     function="SpellCheck.VisibleSuggestion"
+     parameter="1" />
+  </menu_item_call>
+  <menu_item_call
+   label="(unknown)"
+   layout="topleft"
+   name="Suggestion 3">
+    <menu_item_call.on_click
+     function="SpellCheck.ReplaceWithSuggestion"
+     parameter="2" />
+    <menu_item_call.on_visible
+     function="SpellCheck.VisibleSuggestion"
+     parameter="2" />
+  </menu_item_call>
+  <menu_item_call
+   label="(unknown)"
+   layout="topleft"
+   name="Suggestion 4">
+    <menu_item_call.on_click
+     function="SpellCheck.ReplaceWithSuggestion"
+     parameter="3" />
+    <menu_item_call.on_visible
+     function="SpellCheck.VisibleSuggestion"
+     parameter="3" />
+  </menu_item_call>
+  <menu_item_call
+   label="(unknown)"
+   layout="topleft"
+   name="Suggestion 5">
+    <menu_item_call.on_click
+     function="SpellCheck.ReplaceWithSuggestion"
+     parameter="4" />
+    <menu_item_call.on_visible
+     function="SpellCheck.VisibleSuggestion"
+     parameter="4" />
+  </menu_item_call>
+  <menu_item_separator
+   layout="topleft"
+   name="Suggestion Separator" />
+  <menu_item_call
+   label="Add to Dictionary"
+   layout="topleft"
+   name="Add to Dictionary">
+    <menu_item_call.on_click
+     function="SpellCheck.AddToDictionary" />
+    <menu_item_call.on_enable
+     function="SpellCheck.EnableAddToDictionary" />
+  </menu_item_call>
+  <menu_item_call
+   label="Add to Ignore"
+   layout="topleft"
+   name="Add to Ignore">
+    <menu_item_call.on_click
+     function="SpellCheck.AddToIgnore" />
+    <menu_item_call.on_enable
+     function="SpellCheck.EnableAddToIgnore" />
+  </menu_item_call>
+  <menu_item_separator
+   layout="topleft"
+   name="Spellcheck Separator" />
   <menu_item_call
    label="Cut"
    layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 72454a1a1abef590ded610acc399d4866df700d6..126a32684c07c184c0c3c127a5f374831b7fd657 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -2358,6 +2358,93 @@ Would you be my friend?
     </form>
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   label="Add Auto-Replace List"
+   name="AddAutoReplaceList"
+   type="alertmodal">
+    <tag>addlist</tag>
+    Name for the new list:
+    <tag>confirm</tag>
+    <form name="form">
+      <input name="listname" type="text"/>
+      <button
+       default="true"
+       index="0"
+       name="SetName"
+       text="OK"/>
+    </form>
+  </notification>
+
+  <notification
+   icon="alertmodal.tga"
+   label="Rename Auto-Replace List"
+   name="RenameAutoReplaceList"
+   type="alertmodal">
+    The name '[DUPNAME]' is in use
+    Enter a new unique name:
+    <tag>confirm</tag>
+    <form name="form">
+      <input name="listname" type="text"/>
+      <button
+       default="false"
+       index="0"
+       name="ReplaceList"
+       text="Replace Current List"/>
+      <button
+       default="true"
+       index="1"
+       name="SetName"
+       text="Use New Name"/>
+    </form>
+  </notification>
+
+  <notification
+   icon="alertmodal.tga"
+   name="InvalidAutoReplaceEntry"
+   type="alertmodal">
+    The keyword must be a single word, and the replacement may not be empty.
+    <tag>fail</tag>
+  </notification>
+
+  <notification
+   icon="alertmodal.tga"
+   name="InvalidAutoReplaceList"
+   type="alertmodal">
+    That replacement list is not valid.
+    <tag>fail</tag>
+  </notification>
+
+  <notification
+   icon="alertmodal.tga"
+   name="SpellingDictImportRequired"
+   type="alertmodal">
+    You must specify a file, a name, and a language.
+    <tag>fail</tag>
+  </notification>
+
+  <notification
+   icon="alertmodal.tga"
+   name="SpellingDictIsSecondary"
+   type="alertmodal">
+The dictionary [DIC_NAME] does not appear to have an "aff" file; this means that it is a "secondary" dictionary.
+It can be used as an additional dictionary, but not as your Main dictionary.
+
+See https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
+    <tag>confirm</tag>
+  </notification>
+
+  <notification
+   icon="alertmodal.tga"
+   name="SpellingDictImportFailed"
+   type="alertmodal">
+    Unable to copy
+    [FROM_NAME]
+    to
+    [TO_NAME]
+    <tag>fail</tag>
+  </notification>
+
   <notification
  icon="alertmodal.tga"
  label="Save Outfit"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index 0faa1598b1b932cbaa7d28dbbe8756bc6714c299..553c112e6fc7025f6f24071d4c8a534b81f891a9 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -134,6 +134,7 @@
          top_pad="2"
          max_length="1023"
          name="pick_desc"
+         spellcheck="true"
          text_color="black"
          word_wrap="true" />
         <text
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 607e1bb2135ba621643a3df3037e316c457f45b2..6d5fb51e85892d86d1836e4a89c8681629459821 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -141,6 +141,7 @@ Maximum 200 per group daily
          max_length_bytes="63"
          name="create_subject"
          prevalidate_callback="ascii"
+         spellcheck="true"
          width="218" />
         <text
          follows="left|top"
@@ -161,6 +162,7 @@ Maximum 200 per group daily
          left_pad="3"
          max_length="511"
          name="create_message"
+         spellcheck="true"
          top_delta="0"
          width="218"
          word_wrap="true" />
@@ -309,6 +311,7 @@ Maximum 200 per group daily
          left_pad="3"
          max_length_bytes="63"
          name="view_subject"
+         spellcheck="true"
          top_delta="-1"
          visible="false"
          width="200" />
@@ -333,6 +336,7 @@ Maximum 200 per group daily
          right="-1"
          max_length="511"
          name="view_message"
+         spellcheck="true"
          top_delta="-40"
          width="313"
          word_wrap="true" />
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 21c627cdfb82407f50b9c27be99559f1d9cf74fc..6bc9c48729dbb6189dc2f82fed66363668d3c10c 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -19,6 +19,7 @@
      left="0"
      max_length_bytes="1023"
      name="chat_box"
+     spellcheck="true"
      text_pad_left="5"
      text_pad_right="25"
      tool_tip="Press Enter to say, Ctrl+Enter to shout"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index caf7fc85f569d5d50a1cf40eeb4b98244885afd0..27193a984f0087e81099223de5f4736f8812e43a 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -207,13 +207,36 @@
   <button
    follows="left|top"
    height="23"
-   label="Chat Translation Settings"
+   label="Translation..."
    layout="topleft"
    left="30"
    name="ok_btn"
-   top="-40"
+   top="-50"
    width="170">
    <button.commit_callback
     function="Pref.TranslationSettings" />
   </button>
-</panel>
\ No newline at end of file
+  <button
+   follows="top|left"
+   height="23"
+   layout="topleft"
+   top_pad="-23"
+   left_pad="5"
+   name="autoreplace_showgui"
+   commit_callback.function="Pref.AutoReplace"
+   label="Auto-Replace..."
+   width="150">
+  </button>
+  <button
+   follows="top|left"
+   height="23"
+   layout="topleft"
+   top_pad="-23"
+   left_pad="5"
+   name="spellcheck_showgui"
+   commit_callback.function="Pref.SpellChecker"
+   label="Spell Checking..."
+   width="150">
+  </button>
+
+</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 1953a321ce4d6d8f47835a8df6274d6af3019560..6dd80dc11ae6126e6a57fdff3486c754ad3f6562 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -441,6 +441,7 @@ Please try logging in again in a minute.</string>
 	<string name="load_files">Load Files</string>
 	<string name="choose_the_directory">Choose Directory</string>
 	<string name="script_files">Scripts</string>
+	<string name="dictionary_files">Dictionaries</string>
 
   <!-- LSL Usage Hover Tips -->
   <!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window).
@@ -3760,4 +3761,7 @@ Try enclosing path to the editor with double quotes.
 
   <string name="TeleportMaturityExceeded">The Resident cannot visit this region.</string>
 
+  <!-- Spell check settings floater -->
+  <string name="UserDictionary">[User]</string>
+  
   </strings>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 36267803e3e99360e8222e8a2187927018a44441..56641ba01e1d7f8203ab93a2a6b80250e2568b6d 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -91,6 +91,13 @@ class ViewerManifest(LLManifest):
 
                 # ... and the entire windlight directory
                 self.path("windlight")
+
+                # ... and the included spell checking dictionaries
+                pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')
+                if self.prefix(src=pkgdir,dst=""):
+                    self.path("dictionaries")
+                    self.end_prefix(pkgdir)
+
                 self.end_prefix("app_settings")
 
             if self.prefix(src="character"):
@@ -393,6 +400,9 @@ class WindowsManifest(ViewerManifest):
             self.path("ssleay32.dll")
             self.path("libeay32.dll")
 
+            # Hunspell
+            self.path("libhunspell.dll")
+
             # For google-perftools tcmalloc allocator.
             try:
                 if self.args['configuration'].lower() == 'debug':
@@ -659,6 +669,7 @@ class DarwinManifest(ViewerManifest):
 
             # copy additional libs in <bundle>/Contents/MacOS/
             self.path("../packages/lib/release/libndofdev.dylib", dst="Resources/libndofdev.dylib")
+            self.path("../packages/lib/release/libhunspell-1.3.0.dylib", dst="Resources/libhunspell-1.3.0.dylib")
 
             self.path("../viewer_components/updater/scripts/darwin/update_install", "MacOS/update_install")
 
@@ -1044,6 +1055,8 @@ class Linux_i686Manifest(LinuxManifest):
             self.path("libdirectfb-1.4.so.5")
             self.path("libfusion-1.4.so.5")
             self.path("libdirect-1.4.so.5")
+            self.path("libhunspell-1.3.so")
+            self.path("libhunspell-1.3.so.0")
             self.path("libalut.so")
             self.path("libopenal.so", "libopenal.so.1")
             self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname