[Pkg-mono-svn-commits] [SCM] mono-uia branch, master, updated. debian/1.0-2-5-g2c24ad1

Ray Wang raywang at gnome.org
Wed Sep 29 08:50:15 UTC 2010


The following commit has been merged in the master branch:
commit 90b853dadc68e1de0e603d638b95a300150f7098
Author: Ray Wang <raywang at gnome.org>
Date:   Tue Sep 7 16:41:46 2010 +0800

    Imported Upstream version 2.1

diff --git a/ChangeLog b/ChangeLog
index 734c50c..1618bf1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,261 +1,5057 @@
-2009-03-17  Brad Taylor  <brad at getcoded.net>
+# Generated by Makefile. Do not edit.
 
-	* NEWS: Update codename for 1.0.
+commit 5a2c544e68b56d5f646bc094cdca759451ccdaa6
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Fri Aug 20 14:56:49 2010 -0600
 
-2009-03-13  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+    Prepping for 2.1 the Zoidberg release
 
-	* NEWS:
-	* configure.ac: Bump version to 1.0, update dependencies.
+ UIAutomation/NEWS         |    9 +++++++++
+ UIAutomation/configure.ac |    2 +-
+ 2 files changed, 10 insertions(+), 1 deletions(-)
 
-2009-02-26  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+commit dc5916030fe87ffbd274f87be41414e089e5404d
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Thu Aug 5 13:03:12 2010 -0600
 
-	* WindowsBase/System.Windows/Rect.cs: For Rect.Empty, return
-	Size.Empty for Size. Previously this would throw an exception
-	on Size construction.
+    Update all spec files and NEWS files for 2.0.95 release
 
-2008-11-25  Brad Taylor  <brad at getcoded.net>
-	
-	* Makefile.include: Correct path for 64-bit systems.
+ UIAutomation/NEWS |    4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
 
-2008-11-25  Brad Taylor  <brad at getcoded.net>
-	
-	* data/mono-uia.pc.in.in: Add UIAutomationClient to the Libs directive.
+commit be003b197083e8395136bb8fae58eb1b93ecdb36
+Author: Mario Carrion <mcarrion at novell.com>
+Date:   Mon Aug 2 23:20:59 2010 -0400
 
-2008-11-12  Brad Taylor  <brad at getcoded.net>
-	
-	* NEWS: Move NEWS file into each individual module.
+    ChangeLog files are autogenerated by "make dist"
 
-2008-11-20  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+ UIAutomation/ChangeLog                           |  600 ----------------------
+ UIAutomation/Makefile.am                         |   14 +
+ UIAutomation/UIAutomationBridge/ChangeLog        |  171 ------
+ UIAutomation/UIAutomationClient/ChangeLog        |  303 -----------
+ UIAutomation/UIAutomationClientTests/ChangeLog   |  375 --------------
+ UIAutomation/UIAutomationProvider/ChangeLog      |  261 ----------
+ UIAutomation/UIAutomationProvider/Test/ChangeLog |   34 --
+ UIAutomation/UIAutomationSource/ChangeLog        |   54 --
+ UIAutomation/UIAutomationTypes/ChangeLog         |  590 ---------------------
+ UIAutomation/UIAutomationTypes/Test/ChangeLog    |  196 -------
+ 10 files changed, 14 insertions(+), 2584 deletions(-)
 
-	* COPYING: Add to top-level of each tarball.
+commit 0f4b70db5ba8311c071915762584bde394d6c795
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Jul 21 13:44:09 2010 +0000
 
-2008-11-12  Andrés G. Aragoneses  <aaragoneses at novell.com>
+    * UIAutomationClientTests/CacheRequestTest.cs:
+    Add tests for properties and patterns.
+    
+    svn path=/trunk/uia2atk/; revision=160677
 
-	* UIAutomation.mds: Revert previous dumb changes.
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    5 +
+ .../UIAutomationClientTests/CacheRequestTest.cs    | 1045 +++++++++++++++++++-
+ 2 files changed, 1024 insertions(+), 26 deletions(-)
 
-2008-11-12  Andrés G. Aragoneses  <aaragoneses at novell.com>
+commit c73f98582cc70bbaf1fd938eded358acfdacffb3
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Tue Jul 20 15:04:22 2010 +0000
 
-	* UIAutomation.mds: Update for new locations.
+    Didn't mean to commit the actual spec files
+    
+    svn path=/trunk/uia2atk/; revision=160614
 
-2008-11-10  Brad Taylor  <brad at getcoded.net>
-	
-	* */: Make distcheck pass.
+ UIAutomation/data/mono-uia-Fedora_12.spec     |   85 -----------------------
+ UIAutomation/data/mono-uia-Fedora_13.spec     |   69 -------------------
+ UIAutomation/data/mono-uia-openSUSE_11.2.spec |   91 -------------------------
+ UIAutomation/data/mono-uia-openSUSE_11.3.spec |   77 ---------------------
+ UIAutomation/data/mono-uia.pc.in              |    5 --
+ 5 files changed, 0 insertions(+), 327 deletions(-)
 
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+commit 68b03f138096ea13e0e45a8294ff5abef6381390
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Tue Jul 20 15:01:28 2010 +0000
 
-	* WindowsBase/Makefile.am: Add "/package 2.0" gacutil flag to create
-	WindowsBase symlink in the correct location.
+    Adding specific spec files
+    
+    svn path=/trunk/uia2atk/; revision=160613
 
-2008-11-07  Brad Taylor  <brad at getcoded.net>
+ UIAutomation/data/mono-uia-Fedora_12.spec     |   85 +++++++++++++++++++++++
+ UIAutomation/data/mono-uia-Fedora_13.spec     |   69 +++++++++++++++++++
+ UIAutomation/data/mono-uia-openSUSE_11.2.spec |   91 +++++++++++++++++++++++++
+ UIAutomation/data/mono-uia-openSUSE_11.3.spec |   77 +++++++++++++++++++++
+ UIAutomation/data/mono-uia.pc.in              |    5 ++
+ 5 files changed, 327 insertions(+), 0 deletions(-)
 
-	* Makefile.am:
-	* configure.ac:
-	* WindowsBase/: Import a small portion of WindowsBase so that we can
-	  build UIAutomation* independently of olive.
+commit 88eb0674f2e66d795291f7a24935ac57a8c08f6c
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Mon Jul 19 20:20:48 2010 +0000
 
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+    Create distro specific spec files
+    
+    svn path=/trunk/uia2atk/; revision=160584
 
-	* data/Makefile.am:
-	* data/mono-uia.pc.in:
-	* data/mono-uia.pc.in.in: Let configure stage take care of replacing
-	@VERSION at .
+ UIAutomation/configure.ac                        |    6 +-
+ UIAutomation/data/fedora/mono-uia-libdir.patch   |  112 ----------------------
+ UIAutomation/data/fedora/mono-uia.spec.in        |   89 -----------------
+ UIAutomation/data/mono-uia-Fedora_12.spec.in     |   85 ++++++++++++++++
+ UIAutomation/data/mono-uia-Fedora_13.spec.in     |   69 +++++++++++++
+ UIAutomation/data/mono-uia-libdir-fedora.patch   |  112 ++++++++++++++++++++++
+ UIAutomation/data/mono-uia-openSUSE_11.2.spec.in |   91 ++++++++++++++++++
+ UIAutomation/data/mono-uia-openSUSE_11.3.spec.in |   77 +++++++++++++++
+ UIAutomation/data/mono-uia.spec.in               |   91 ------------------
+ 9 files changed, 438 insertions(+), 294 deletions(-)
 
-	* Makefile.am:
-	* configure.ac: Remove cruft.
+commit ef64cb45e937b3a1684e198dd52b2ed28da1760b
+Merge: e129215 19564eb
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Mon Jul 19 15:32:38 2010 +0000
 
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+    Move fedora spec files and patches into the respective data directory
+    
+    svn path=/trunk/uia2atk/; revision=160572
 
-	* Makefile.include: Support passing "/package accessibility" argument to
-	gacutil via PACKAGE_FLAG var.
+commit 0bdc034508bfd1371e1a8cd9d0e5e647de2a2905
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Sat Jul 17 00:13:35 2010 +0000
 
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+    Post release rev bump
+    
+    svn path=/trunk/uia2atk/; revision=160509
 
-	* configure.ac: Check for sn.
+ UIAutomation/configure.ac |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
 
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+commit eb7f19af72ea4e82a43d0790239ea167e1b0cbca
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Jul 14 17:29:06 2010 +0000
 
-	* mkinstalldirs: Copy from olive.
+    Prepping for 2.0.94 release
+    
+    svn path=/trunk/uia2atk/; revision=160373
 
-	* data/Makefile.am: Copy stuff from olive/build/rules.make needed by
-	this makefile.  Could use some cleanup of relative paths, names, etc.
+ UIAutomation/NEWS |    9 +++++++++
+ 1 files changed, 9 insertions(+), 0 deletions(-)
 
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+commit ec96e4d6881df77c4057cbcf1c586c4821578c7f
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Jul 14 14:54:36 2010 +0000
 
-	* data/Makefile:
-	* data/Makefile.am: Rename to Makefile.am, make it start to work.
+    * System.Windows.Automation/AutomationElement.cs: Fix NRE.
+    Remove TreeFilter check from GetUpdatedCache to match Windows behavior.
+    
+    * UIAutomationClientTests/CacheRequestTest.cs: Add TextPattern test.
+    Add PropertyChanged event test.
+    Add test to call a method on a cached pattern.
+    
+    * SampleForm/Form1.cs: Allow arbitrary setting of TextBox text.
+    
+    svn path=/trunk/uia2atk/; revision=160359
 
-	* Makefile.am: Add winfx3.pub to EXTRA_DIST.
+ UIAutomation/UIAutomationClient/ChangeLog          |    5 +
+ .../System.Windows.Automation/AutomationElement.cs |    5 +-
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    8 +
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   16 ++-
+ .../UIAutomationClientTests/CacheRequestTest.cs    |  215 ++++++++++++++++++-
+ 5 files changed, 231 insertions(+), 18 deletions(-)
 
-	* configure.ac: Re-add data/Makefile.
+commit d49e7bd2869a94a4425df55ad5f132d545f03668
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Thu Jul 1 16:31:30 2010 +0000
 
-	* build/common/Consts.cs.in: Don't need MonoVersion, afict.
+    Bumping the rev for next release
+    
+    svn path=/trunk/uia2atk/; revision=159787
 
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+ UIAutomation/configure.ac |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
 
-	* winfx3.pub: Add key for signing these assemblies, copied from olive.
+commit 89bbfecde32f841b2fc6973849f64208c11c41b9
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Jun 30 14:14:18 2010 +0000
 
-	* configure.ac: Remove data for now, not done fixing this.  Add
-	buil/common/Consts.cs (still need to set MONO_VERSION).
+    Prep for 2.0.93 release
+    
+    svn path=/trunk/uia2atk/; revision=159731
 
-	* configure:
-	* build/common/MonoVersion.cs:
-	* build/common/TestConfiguration.cs: Remove unneeded files.
+ UIAutomation/NEWS |    3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
 
-	* data/ChangeLog:
-	* build/common/ChangeLog: Removed excessive ChangeLogs.
+commit 5a930474a33389704175496e3ac6087aa7c07c1c
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Jun 25 15:39:42 2010 +0000
 
-2008-11-06  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+    In UIAutomation/UIAutomationClientTests/:
+    	* UIAutomationClientTests/BaseTest.cs:
+    	* UIAutomationClientTests/TableTest.cs:
+    	* UIAutomationClientTests/ScrollTest.cs:
+    	* UIAutomationClientTests/TextPatternTest.cs:
+    	* UIAutomationClientTests/CustomControlTest.cs:
+    	* UIAutomationClientTests/SelectionPatternTest.cs:
+    	* UIAutomationClientTests/MultipleViewPatternTest.cs:
+    	Ensure that TestFixtureTearDown is called when TestFixtureSetUp fails,
+    	to prevent having stray SampleForm processes running amok.
+    	* UIAutomationClientTests/AutomationTest.cs:
+    	* UIAutomationClientTests/RootElementTest.cs:
+    	Track other SampleForm processes to ensure they are cleand up
+    	during TearDown.
+    	* UIAutomationClientTests/RangeValuePatternTest.cs:
+    	Fix broken condition for location horizontal scroll bar element.
+    
+    svn path=/trunk/uia2atk/; revision=159543
 
-	* UIAutomation.mds: Move top-level solution to top-level.
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   20 +++++++++++
+ .../UIAutomationClientTests/AutomationTest.cs      |   13 +++++++
+ .../UIAutomationClientTests/BaseTest.cs            |   34 +++++++++++++-------
+ .../UIAutomationClientTests/CustomControlTest.cs   |    4 +-
+ .../MultipleViewPatternTest.cs                     |    5 +--
+ .../RangeValuePatternTest.cs                       |   20 ++++++-----
+ .../UIAutomationClientTests/RootElementTest.cs     |   20 ++++++++---
+ .../UIAutomationClientTests/ScrollTest.cs          |    4 +-
+ .../SelectionPatternTest.cs                        |    4 +-
+ .../UIAutomationClientTests/TableTest.cs           |    4 +-
+ .../UIAutomationClientTests/TextPatternTest.cs     |    4 +-
+ 11 files changed, 92 insertions(+), 40 deletions(-)
 
-2008-10-23  Brad Taylor  <brad at getcoded.net>
-	
-	* Makefile:
-	* UIAutomationClient/: Add a new UIA dll.
+commit d56f24c31572cb053d63aaa4ff084c210bf92cfc
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Tue Jun 22 01:37:37 2010 +0000
 
-2008-05-13  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+    Rev for the next release
+    
+    svn path=/trunk/uia2atk/; revision=159308
 
-	* Moved IAutomationBridge interface to a new
-	  assembly, UIAutomationBridge.
+ UIAutomation/configure.ac |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
 
-2008-03-20  Sebastien Pouliot  <sebastien at ximian.com>
+commit faf2d7b2d82e397b421106c6606763ec9b959d4b
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Jun 16 18:07:51 2010 +0000
 
-	* Makefile: remove all unexisting public keys.
+    Update NEWS and version for 2.0.92 release
+    
+    svn path=/trunk/uia2atk/; revision=159030
 
-2008-03-20  Atsushi Enomoto  <atsushi at ximian.com>
+ UIAutomation/NEWS |    5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
 
-	* Makefile : make dist fixage.
+commit 60043a95ff60575db521dfde0a3b1559fedf89a8
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Jun 2 18:30:36 2010 +0000
 
-2008-03-19  Sebastien Pouliot  <sebastien at ximian.com>
+    * Element.cs, TableCellElement.cs, AutomationSource.cs,
+    TableElement.cs, DataItemElement.cs: Fix issues with TreeItems
+    sometimes not being created correctly.
+    Expose a dialog painted on a window as a child of the window, even if
+    at-spi exposes it as a child of the application [BNC#590768]
+    
+    * TextSource.cs, SelectionSource.cs: Support SupportedTextSelection.
+    
+    * UIAutomationClientTests/TableHierarchyTest.cs: Test parent of DataItemElement.
+    
+    * AtspiUiaClientTests/DialogTest.cs, AtspiUiaClientTests/Makefile.am:
+    Test that a dialog painted on a window is a child of the window.
+    
+    svn path=/trunk/uia2atk/; revision=158354
 
-	* atlas.pub, orcas.pub, msfinal3.pub, winfx.pub:
-		Remove duplicate and conflicting (same name in other SVN
-		modules but different public keys). 
-	* winfx3.pub: New 3[.5] public key is now named winfx3.pub
-	* silverlight.pub: Add silverlight 2.0 public key.
-	* System.ServiceModel.Web/Assembly/AssemblyInfo.cs
-	* agmono/Assembly/AssemblyInfo.cs
-	* PresentationCore/Assembly/AssemblyInfo.cs
-	* WindowsBase/Assembly/AssemblyInfo.cs
-	* PresentationFramework/Assembly/AssemblyInfo.cs
-	* System.IdentityModel/Assembly/AssemblyInfo.cs
-	* System.Workflow.Activities/Assembly/AssemblyInfo.cs
-	* System.ServiceModel/Assembly/AssemblyInfo.cs
-	* System.Workflow.Runtime/Assembly/AssemblyInfo.cs
-	* System.Workflow.ComponentModel/Assembly/AssemblyInfo.cs
-	* System.Runtime.Serialization/Assembly/AssemblyInfo.cs
-	* UIAutomationProvider/Assembly/AssemblyInfo.cs
-	* System.IdentityModel.Selectors/Assembly/AssemblyInfo.cs
-	* UIAutomationTypes/Assembly/AssemblyInfo.cs:
-		Fix the AssemblyInfo with new key names.
+ .../AtspiUiaClientTests/DialogTest.cs              |   88 ++++++++++++++++++++
+ .../AtspiUiaClientTests/Makefile.am                |    1 +
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    7 ++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |    9 ++
+ .../UIAutomationClientTests/TableHierarchyTest.cs  |    3 +
+ 5 files changed, 108 insertions(+), 0 deletions(-)
 
-2008-03-03  Marek Safar  <marek.safar at gmail.com>
+commit d7b7df82e847fde8c5ca4e0d7cce6be700901f42
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed May 26 18:36:39 2010 +0000
 
-	* Makefile: Moved System.Data.Linq to mcs.
+    Rev'ed for the next release
+    
+    svn path=/trunk/uia2atk/; revision=157980
 
-2008-02-08  Calvin Gaisford <calvinrg at gmail.com>
+ UIAutomation/configure.ac |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
 
-	* Makefile: Added UIAutomationTypes, UIAutomationProvider to build
+commit dd7e5cbfcebe27bdf52e3a043ae6eba9cbd0be1c
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed May 26 18:18:40 2010 +0000
 
-2008-02-08  Calvin Gaisford <calvinrg at gmail.com>
+    Prepping for the 2.0.91 release
+    
+    svn path=/trunk/uia2atk/; revision=157978
 
-	* UIAutomationTypes: Added new directory/code for Automation assmebly
-	* UIAutomationProvider: Added new directory/code for Automation assmebly
+ UIAutomation/NEWS         |    4 ++++
+ UIAutomation/configure.ac |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletions(-)
 
-2007-11-29  Atsushi Enomoto  <atsushi at ximian.com>
+commit 92beabe081799c248e491ac2a143dd8c5c3ce49b
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed May 12 20:52:21 2010 +0000
 
-	* Makefile : System.Xml.Linq is moved to mcs/class.
+    Bumping the gtk-sharp version to 2.12.10
+    
+    svn path=/trunk/uia2atk/; revision=157264
 
-2007-09-05  Wade Berrier  <wberrier at novell.com>
+ UIAutomation/data/mono-uia.spec.in |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
 
-	* Makefile: Add orcas.pub to DIST
-	Create 2.1 and 3.5 lib dirs during make dist
+commit 730787d10fae3119c76ee2850f269584697d4616
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed May 12 17:35:24 2010 +0000
 
-2007-09-01  Atsushi Enomoto  <atsushi at ximian.com>
+    Updated NEWS for 2.0.90 release
+    
+    svn path=/trunk/uia2atk/; revision=157254
 
-	* Makefile : let's just drop System.Web.Extensions from the build.
-	  It will become outdated and will become much easier to import
-	  Mainsoft works (if we really need separate one).
+ UIAutomation/NEWS |   30 ++++++++++++++++++++++++++++++
+ 1 files changed, 30 insertions(+), 0 deletions(-)
 
-2007-09-01  Atsushi Enomoto  <atsushi at ximian.com>
+commit 96e797ecb5f036b9f2a53e9d63af2535ce4a3ee5
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed May 12 17:16:21 2010 +0000
 
-	* orcas.pub : new file, got from sn -e System.ServiceModel.Web.dll.
+    Updated rev for 2.0.90 release
+    
+    svn path=/trunk/uia2atk/; revision=157253
 
-2007-08-24  Marek Safar  <marek.safar at gmail.com>
+ UIAutomation/configure.ac |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
 
-	* Makefile: Add System.ServiceModel.Web, System.Web.Extensions.
-	
-2007-08-24  Marek Safar  <marek.safar at gmail.com>
+commit cf42f59cf5a3c7edc01a090ec21557e98d0c417f
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Wed May 12 15:10:48 2010 +0000
 
-	* Makefile: Add 3.5 profile.
-	
-2007-08-23  Marek Safar  <marek.safar at gmail.com>
+    In UIAutomation/:
+    	* UIAutomationClientTests/UIAutomationClientTests/MultipleViewPatternTest.cs:
+    	Update test to our new MultipleViewPattern implementation
+    
+    In UIAutomationWinforms/:
+    	* UIAutomationWinformsTests/ListViewProviderTest.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ListViewProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/ListView/MultipleViewProviderBehavior.cs:
+    	Change to implement ListView's MultiViewPattern in the "correct way", and update related tests.
+    
+    In UiaDbus/:
+    	* UiaDbusSource/DbusExceptionTranslator.cs:
+    	Translate dbus's InvalidArgs error into ArgumentException.
+    
+    svn path=/trunk/uia2atk/; revision=157245
 
-	* ecma.pub: Copied from mcs.
+ UIAutomation/ChangeLog                             |    5 ++
+ .../MultipleViewPatternTest.cs                     |   41 ++++----------------
+ 2 files changed, 13 insertions(+), 33 deletions(-)
 
-2007-08-07  Jb Evain  <jbevain at novell.com>
+commit a61930906217edf83ab87a4bcb2e03048d185d1a
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Thu May 6 13:04:16 2010 +0000
 
-	* Makefile, 2.1 profile: System.Silverlight depends on agmono.
+    * Mono.UIAutomation.Winforms/ToolStripProvider.cs: Give
+    AccessibleName preedence over Text.
+    
+    * ToolStripProviderTest.cs: Test that AccessibleName is used in
+    preference to Text for the name.
+    
+    * Element.cs, ExpandCollapseSource.cs: Use child accessible for
+    ExpandCollapsePattern in a DataItem.
+    
+    * Element.cs: Mark IsControlElement and IsContentElement as supported.
+    
+    * Element.cs: Do not expose Grid/GridItem for a Tree/TreeItem.
+    Do not expose InvokePattern for a CheckBox.
+    Do not expose SelectionPattern for a MenuBar.
+    
+    * UIAutomationClientTests/TableHierarchyTest.cs, GtkForm/GtkForm.cs:
+    Expect check boxes in the table for Winforms.
+    Fix name of boolean cells to be the same in Gtk as in Winforms.
+    Do not assume that a treeItem has no children when collapsed.
+    Test TreeView patterns.
+    
+    * UIAutomationClientTests/AutomationElementTest.cs:
+    Assume that IsContentElement is true for a label in gtk.
+    Check that a Spinner does not expose InvokePattern.
+    
+    * UIAutomationClientTests/AutomationElementTest.cs, GtkForm/GtkForm.cs:
+    Test checkBox patterns.
+    
+    * UIAutomationClientTests/BaseTest.cs,
+    UIAutomationClientTests/TogglePatternTest.cs: Fix checkboxes.
+    
+    * UIAutomationClientTests/BaseTest.cs: Catch
+    InvalidOperationException and display pattern name in VerifyPatterns.
+    
+    * UIAutomationClientTests/MenuTest.cs: Test MenuBar patterns.
+    
+    * AtspiUiaClientTests/TableHierarchyTest.cs, GtkForm/GtkForm.cs:
+    Test DataItem patterns.
+    
+    
+    svn path=/trunk/uia2atk/; revision=156800
 
-2007-07-23  Miguel de Icaza  <miguel at novell.com>
+ .../AtspiUiaClientTests/TableHierarchyTest.cs      |   20 ++++++++
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   26 ++++++++++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |   52 ++++++++++++--------
+ .../AutomationElementTest.cs                       |   13 +++++-
+ .../UIAutomationClientTests/BaseTest.cs            |   29 +++++++----
+ .../UIAutomationClientTests/MenuTest.cs            |    2 +
+ .../UIAutomationClientTests/TableHierarchyTest.cs  |   22 ++++++--
+ .../UIAutomationClientTests/TogglePatternTest.cs   |   10 ++--
+ 8 files changed, 131 insertions(+), 43 deletions(-)
 
-	* Add System.Windows.Interop/PluginHost.cs to expose the plugin
-	handle to other assemblies (System.Silverlight).
+commit ba0f1c7babf8facdcb403a3d14212d1fbf517678
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Mon May 3 12:59:29 2010 +0000
 
-2007-06-15  Atsushi Enomoto  <atsushi at ximian.com>
+    2010-05-03  Mario Carrion  <mcarrion at novell.com>
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* AtspiUiaClientTests/Makefile.am: Copy UIAutomationBridge.dll to
+    	build tests.
+    
+    svn path=/trunk/uia2atk/; revision=156617
 
-	* Makefile : we can add agclr here. It's mostly stable.
+ .../AtspiUiaClientTests/Makefile.am                |   11 +++++++++++
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    5 +++++
+ 2 files changed, 16 insertions(+), 0 deletions(-)
 
-2007-06-04  Olivier Dufour  <olivier.duff at gmail.com>
+commit 813b89ef2468d3464284d99684fc3a0d73d0fff5
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Fri Apr 30 18:17:52 2010 +0000
 
-	* remove Microsoft.Scripting (see mailing list for explaination)
-	
-2007-05-31  Olivier Dufour  <olivier.duff at gmail.com>
+    * Element.cs: Handle CheckMenuItem.
+    Disable TextPattern for roles other than Text and PasswordText.
+    Return ControlType.MenuItem for Role.Menu (BNC#598803)
+    Remove patterns from separator (BNC#598036)
+    
+    * UIAutomationClientTests/AutomationElementTest.cs,
+    UIAutomationClientTests/BaseTest.cs: Move VerifyPatterns to BaseTest.
+    
+    * UIAutomationClientTests/BaseTest.cs, SampleForm/Form1.cs,
+    GtkForm/GtkForm.cs, UIAutomationClientTests/Menutest.cs,
+    AtspiUiaClientTests/menuTest.cs, UIAutomationClientTests/Makefile.am,
+    AtspiUiaClientTests/Makefile.am,
+    	UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	Add tests for some gtk menu bugs.
+    
+    svn path=/trunk/uia2atk/; revision=156543
 
-	* rename Mono.JScript.Compiler => Microsoft.JScript.Compiler
-	* rename Mono.JScript.Runtime => Microsoft.JScript.Runtime
-	* rename Mono.Scripting => Microsoft.Scripting
-	
-2007-05-30  Joel Reed  <joelwreed at comcast.com>
+ .../AtspiUiaClientTests/Makefile.am                |    1 +
+ .../AtspiUiaClientTests/MenuTest.cs                |   69 ++++++++++++++++
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   12 +++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |   19 +++++
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   17 ++++
+ .../AutomationElementTest.cs                       |   28 -------
+ .../UIAutomationClientTests/BaseTest.cs            |   41 +++++++++-
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests/MenuTest.cs            |   83 ++++++++++++++++++++
+ .../UIAutomationClientTests.csproj                 |    1 +
+ 10 files changed, 239 insertions(+), 33 deletions(-)
 
-	* add initial code for System.ServiceModel.Web.dll, with
-	some initial Atom and Rss syndication feed writing code and tests
+commit 0dd02eb5d08bf436b8822bda1edcbba6f7ee2362
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Apr 21 18:17:54 2010 +0000
 
-2007-05-28  Olivier Dufour  <olivier.duff at gmail.com>
+    Rev configure.ac for next release
+    
+    svn path=/trunk/uia2atk/; revision=155905
 
-	* initial commit for javascript runtime and scripting lib
-	
-2007-05-28  Atsushi Enomoto  <atsushi at ximian.com>
+ UIAutomation/configure.ac |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
 
-	* Makefile : remove Mono.JScript.Compiler which does not build yet.
+commit fc1d44ea54fd30780dbb28517fd40308263c3f6f
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Apr 21 15:36:58 2010 +0000
 
-	  (olivier made change w/o changelog here)
+    Prepping for 2.0.3 release
+    
+    svn path=/trunk/uia2atk/; revision=155885
 
-2007-02-27  Wade Berrier  <wberrier at novell.com>
+ UIAutomation/NEWS         |    8 ++++++++
+ UIAutomation/configure.ac |    2 +-
+ 2 files changed, 9 insertions(+), 1 deletions(-)
 
-	* Makefile: Add signing keys to DISTFILES,
-	make sure lib output dir is created for 'make dist'
+commit 1636b190d31eba79fbee8543032a6e787d095927
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Thu Apr 15 22:29:06 2010 +0000
 
-2007-02-26  Wade Berrier  <wberrier at novell.com>
+    Adding pkg-config to several of the spec files
+    
+    svn path=/trunk/uia2atk/; revision=155567
 
-	* Makefile: remove non-existant files from DISTFILES
-	and add some DISTFILES
+ UIAutomation/data/mono-uia.spec.in |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
 
-2007-02-06  Atsushi Enomoto  <atsushi at ximian.com>
+commit dfa8264b62ec1f3a2f05b745ae234a04282648e3
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Apr 14 18:36:57 2010 +0000
 
-	* Makefile : System.Xml.XLinq -> System.Xml.Linq
+    * {module}/configure.ac: Added data/{module}.spec
+    * data/{module}.spec.in: Updated with @VERSION@ macro
+    
+    svn path=/trunk/uia2atk/; revision=155416
 
-2007-01-19  Marek Safar  <marek.safar at gmail.com>
+ UIAutomation/ChangeLog             |    4 ++++
+ UIAutomation/configure.ac          |    1 +
+ UIAutomation/data/mono-uia.spec.in |    2 +-
+ 3 files changed, 6 insertions(+), 1 deletions(-)
 
-	* System.Core: Renamed from System.Query.
+commit e8efc7be7ce60e597a1b5aa84727cfe867f033db
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Wed Apr 14 18:03:25 2010 +0000
 
-2006-10-22  Atsushi Enomoto  <atsushi at ximian.com>
+    Fix distcheck in various tarballs.
+    
+    svn path=/trunk/uia2atk/; revision=155414
 
-	(started to log)
-	* Makefile : added System.Runtime.Serialization,
-	  System.IdentityModel, System.IdentityModel.Selectors and
-	  System.ServiceModel.
-	* winfx.pub : new file for signing above assemblies.
-	* System.Runtime.Serialization, System.IdentityModel,
-	  System.IdentityModel.Selectors, System.ServiceModel :
-	  new assemblies for indigo.
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    4 ++++
+ .../UIAutomationClientTests/GtkForm/Makefile.am    |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletions(-)
+
+commit 3d01e05824290caad61aba5f22d44f72c6d1937a
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Apr 14 16:55:31 2010 +0000
+
+    Moving spec files into their respective module - Phase 1
+    
+    svn path=/trunk/uia2atk/; revision=155411
+
+ UIAutomation/data/mono-uia.spec.in |   90 ++++++++++++++++++++++++++++++++++++
+ 1 files changed, 90 insertions(+), 0 deletions(-)
+
+commit 9420f06fcbdb7b317853c286df6ab7398a925f99
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Sun Apr 4 12:41:29 2010 +0000
+
+    * Element.cs: Implement GetSupportedProperties.
+    
+    * UIAutomationClientTests/AutomationElementTest.cs: Test
+    GetCurrentPropertyValue with ignoreDefault for at-spi.
+    
+    svn path=/trunk/uia2atk/; revision=154763
+
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    5 ++
+ .../AutomationElementTest.cs                       |   68 ++++++++++++++++++++
+ 2 files changed, 73 insertions(+), 0 deletions(-)
+
+commit 8f4834627b4991b73542a61f20c699864b0d9e01
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Mar 31 17:47:02 2010 +0000
+
+    Prepping for 2.0.2 heliport release
+    
+    svn path=/trunk/uia2atk/; revision=154564
+
+ UIAutomation/NEWS |   14 ++++++++++++++
+ 1 files changed, 14 insertions(+), 0 deletions(-)
+
+commit b61857ad3046eb9cd4c7b15e523ecdc28934ff43
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Thu Mar 18 21:26:00 2010 +0000
+
+    Bumped versions to next release 2.0.2
+    
+    svn path=/trunk/uia2atk/; revision=153868
+
+ UIAutomation/configure.ac |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+commit 848e0de5f4dafcdd9116ad201f02607572cc27ae
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Mar 17 05:54:47 2010 +0000
+
+    Prep for the 2.0.1 tag
+    
+    svn path=/trunk/uia2atk/; revision=153710
+
+ UIAutomation/NEWS         |   11 +++++++++++
+ UIAutomation/configure.ac |    2 +-
+ 2 files changed, 12 insertions(+), 1 deletions(-)
+
+commit f118c48421092700044d8495e69b7e23f154e237
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Fri Mar 12 16:08:19 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClientTests/UIAutomationClientTests/DataItemTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	Test for ListViewItem's SetValue method and DataGridViewCell's NameProperty
+    
+    In UIAutomationWinforms/:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridViewProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/ListView/ListItemEditValueProviderBehavior.cs:
+    	Fix bug#584340: In ListView, Calling ValuePattern.SetValue on one cell can take effect on another sibling cell.
+    	Fix bug#586635: The NameProperty of DataGridView's Cell is not correctly returned.
+    
+    svn path=/trunk/uia2atk/; revision=153518
+
+ UIAutomation/ChangeLog                             |    8 ++
+ .../UIAutomationClientTests/DataItemTest.cs        |   71 ++++++++++++++++++++
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests.csproj                 |    3 +-
+ 4 files changed, 82 insertions(+), 1 deletions(-)
+
+commit c78e61cf48905aeb52712a7fe6c57a45aeea4fc4
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Sun Mar 7 16:37:25 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/SampleForm/Form1.cs:
+    	* UIAutomationClientTests/SampleForm/Form1.Designer.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClientTests/UIAutomationClientTests/DynamicElementTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	Test ElementNotAvailableException.
+    
+    In UiaDbus/:
+    	* UiaDbusSource/DbusExceptionTranslator.cs: Support
+    	ElementNotAvailableException.
+    
+    svn path=/trunk/uia2atk/; revision=153218
+
+ UIAutomation/ChangeLog                             |   10 ++
+ .../SampleForm/Form1.Designer.cs                   |    2 +-
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    8 ++-
+ .../UIAutomationClientTests/BaseTest.cs            |   19 ++++-
+ .../UIAutomationClientTests/DynamicElementTest.cs  |   95 ++++++++++++++++++++
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests.csproj                 |    3 +-
+ 7 files changed, 132 insertions(+), 6 deletions(-)
+
+commit 388e1b70777c0a652804744415ec6f91d2fa2ede
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Thu Mar 4 22:01:53 2010 +0000
+
+    2010-03-04  Stephen Shaw <sshaw at decriptor.com>
+    
+    * configure.ac: Added a flag to allow windowsbase to be built even
+      when mono 2.5 and later are present.
+    
+    
+    svn path=/trunk/uia2atk/; revision=153048
+
+ UIAutomation/ChangeLog    |    5 +++++
+ UIAutomation/configure.ac |   22 ++++++++++++++--------
+ 2 files changed, 19 insertions(+), 8 deletions(-)
+
+commit 57a9f1f21b0d9225aed302827f72824614f2b4a4
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Mar 4 07:25:45 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs:
+    	Fix some wrong expectations of AutomationElementTest.
+    
+    In UiaDbus/:
+    	* UiaDbusBridge/Application.cs:
+    	* UiaDbusBridge/AutomationBridge.cs:
+    	* UiaDbusBridgeTests/dbusbridgetest.sh.in:
+    	* UiaDbusBridgeTests/AutomationBridgeTest.cs: Fix Bug 571799 - The
+    	dialog who has parent has been found twice.
+    
+    svn path=/trunk/uia2atk/; revision=152998
+
+ UIAutomation/ChangeLog                             |    5 +++++
+ .../AutomationElementTest.cs                       |   12 +++---------
+ 2 files changed, 8 insertions(+), 9 deletions(-)
+
+commit 8392bb2d0a7877ab1f5a358643cc8c3605ebe1cf
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Thu Feb 25 20:18:14 2010 +0000
+
+    Prep for tagging 2.0 hypnotoad
+    
+    svn path=/trunk/uia2atk/; revision=152494
+
+ UIAutomation/NEWS         |    5 ++++-
+ UIAutomation/configure.ac |    2 +-
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 85abe85a610e4a9ea0feaf7cbc32937bbd65cc24
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Thu Feb 25 18:50:58 2010 +0000
+
+    In UIAutomation/UIAutomationClientTests/:
+    	* SampleForm/Form1.cs:
+    	* SampleForm/Makefile.am:
+    	* SampleForm/MyControl.cs:
+    	* SampleForm/SampleForm.csproj:
+    	* UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClientTests/CustomControlTest.cs:
+    	* UIAutomationClientTests/AutomationElementTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	Add new test for controls derived from S.W.Control, which should
+    	by default be ControlType.Pane (bug #574269).
+    
+    In UIAutomationWinforms/UIAutomationWinforms/:
+    	* Mono.UIAutomation.Winforms/ProviderFactory.cs: By default,
+    	treat otherwise-unhandled controls as Panes (bug #574269).
+    	* Mono.UIAutomation.Winforms/PaneProvider.cs: Support LabeledBy.
+    	* Mono.UIAutomation.Winforms/PictureBoxProvider.cs:
+    	* Mono.UIAutomation.Winforms/ScrollableControlProvider.cs:
+    	Stop deriving from PaneProvider.
+    
+    svn path=/trunk/uia2atk/; revision=152491
+
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   13 ++++
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    5 ++
+ .../UIAutomationClientTests/SampleForm/Makefile.am |    1 +
+ .../SampleForm/MyControl.cs                        |   15 +++++
+ .../SampleForm/SampleForm.csproj                   |    1 +
+ .../AutomationElementTest.cs                       |   11 ---
+ .../UIAutomationClientTests/CustomControlTest.cs   |   65 ++++++++++++++++++++
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests.csproj                 |    3 +-
+ 9 files changed, 103 insertions(+), 12 deletions(-)
+
+commit c60de1c7cf23fd8f34102f954735e5859c2f7d38
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Feb 24 22:17:27 2010 +0000
+
+    * AutomationSource.cs: Assume that we will receive a ChildrenChanged
+    event when a window is opened, so do not fire StructureChanged events
+    when an application is created.
+    
+    * GtkForm/GtkForm.cs: Support changing window title.
+    
+    svn path=/trunk/uia2atk/; revision=152408
+
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    4 ++++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |    2 ++
+ 2 files changed, 6 insertions(+), 0 deletions(-)
+
+commit 10cb336a2ef75cff6c4a5b8d79fbb624bb4292c2
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Wed Feb 24 22:07:17 2010 +0000
+
+    In UIAutomation/UIAutomationClient/:
+    	* UIAutomationClient.csproj: Add LINQ.
+    	* System.Windows.Automation/TreeWalker.cs:
+    	Prevent Winforms applications from showing up twice in the UIA tree
+    	by favoring root elements from UiaDbusSource over AtspiUiaSource.
+    	Note that this is a temporary solution until we add true source
+    	merging support in 2.1.
+    
+    svn path=/trunk/uia2atk/; revision=152406
+
+ UIAutomation/UIAutomationClient/ChangeLog          |   10 +++
+ .../System.Windows.Automation/TreeWalker.cs        |   75 ++++++++++++++++---
+ .../UIAutomationClient/UIAutomationClient.csproj   |    1 +
+ 3 files changed, 74 insertions(+), 12 deletions(-)
+
+commit 68201a313f96e411359ffa86e7ff1a050ed92bab
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Wed Feb 24 06:03:09 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationTypes/System.Windows.Automation/AutomationTextAttribute.cs:
+    	* UIAutomationTypes/Test/System.Windows.Automation/TextPatternIdentifiersTest.cs:
+    	Implementation and testing of AutomationTextAttribute.LookupById
+    
+    svn path=/trunk/uia2atk/; revision=152333
+
+ UIAutomation/ChangeLog                             |    6 +
+ .../AutomationTextAttribute.cs                     |   66 ++-
+ .../TextPatternIdentifiersTest.cs                  |  683 +++++++++++++++++++-
+ 3 files changed, 752 insertions(+), 3 deletions(-)
+
+commit a4f27eddd109628fc9b756e40f5a8d42306d7e2a
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Mon Feb 22 22:24:40 2010 +0000
+
+    Prep for the 1.9.90 release
+    
+    svn path=/trunk/uia2atk/; revision=152218
+
+ UIAutomation/NEWS         |   24 ++++++++++++++++--------
+ UIAutomation/configure.ac |    2 +-
+ 2 files changed, 17 insertions(+), 9 deletions(-)
+
+commit b7d0337ad2e76dc8cbdb95b127166835696eb220
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Mon Feb 22 21:00:54 2010 +0000
+
+    * Element.cs: Implement NativeWindowHandle, ProcessId, and
+    GetDescendantFromPoint.
+    
+    * AutomationSource.cs: Init gdk.
+    
+    * AutomationSource.cs: Partly implement GetElementFromhandle.
+    
+    * AutomationSource.cs: handle the root element when checking scope.
+    
+    * AutomationSource.cs: Raise InvokePattern.InvokedEvent on Armed.
+    
+    * makefile.am: Add gtk-sharp.
+    
+    * UIAutomationClientTests/InvokePatternTest.cs: Add test for event
+    when calling InvokePattern.Invoke ().
+    
+    * UIAutomationCLientTests/AutomationElementTest.cs: Disable
+    MoveTo.Origin and associated AutomationElementFromPoint test for at-spi.
+    
+    * UIAutomationClientTests/RootElementTest.cs: Assume that the form is
+    named "TestForm1," even for at-spi.
+    
+    * UIAutomationClientTests/BaseTest.cs: use ProcessIdProperty even for at-spi.
+    
+    svn path=/trunk/uia2atk/; revision=152202
+
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   13 +++++++++++++
+ .../AutomationElementTest.cs                       |   11 +++++++----
+ .../UIAutomationClientTests/BaseTest.cs            |    5 ++---
+ .../UIAutomationClientTests/InvokePatternTest.cs   |    7 +++++++
+ .../UIAutomationClientTests/RootElementTest.cs     |    4 ++--
+ 5 files changed, 31 insertions(+), 9 deletions(-)
+
+commit aaac629f518b96911bcebbe43c5c688a50be094f
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Mon Feb 22 19:27:38 2010 +0000
+
+    Add missing ChangeLog entry
+    
+    svn path=/trunk/uia2atk/; revision=152198
+
+ UIAutomation/UIAutomationClientTests/ChangeLog |   17 +++++++++++++++++
+ 1 files changed, 17 insertions(+), 0 deletions(-)
+
+commit 7149b9f3e68d3e11715e82979baf89ba942d6fa6
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Feb 17 17:01:43 2010 +0000
+
+    * Element.cs: Send BoundingRectangle PropertyChanged events.
+    
+    	* Element.cs: Don't assume that the desktop has a role of DesktopFrame.
+    
+    * AutomationSource.cs: Support FocusChanged events and FocusedElement
+    
+    * UIAutomationCLientTests/FocusTest.cs: Adapt for Atspi, and add
+    SetFocus test.
+    
+    * UIAutomationClientTests/SelectionPatternTest.cs: Work around
+    BGO#578897.
+    
+    * tableHierarchyTest.cs: Test children of TreeView when expanding.
+    
+    * AutomationElementTest.cs: Add BoundingRectangle test.
+    
+    * AtspiUiaClientTests/FocusTest.cs, AtspiUiaClientTests/makefile.am:
+    Add FocusTest.
+    
+    * GtkForm/GtkForm.cs: Add focus commands.
+    
+    * Mono.UIAutomation.Winforms/ListviewProvider.cs: Initialize
+    children if items exist already.
+    
+    svn path=/trunk/uia2atk/; revision=151914
+
+ .../AtspiUiaClientTests/FocusTest.cs               |   49 ++++++++++++++++++++
+ .../AtspiUiaClientTests/Makefile.am                |    1 +
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |    4 ++
+ .../AutomationElementTest.cs                       |   16 +++++-
+ .../UIAutomationClientTests/FocusTest.cs           |   42 +++++++++++++++--
+ .../SelectionPatternTest.cs                        |    6 ++-
+ .../UIAutomationClientTests/TableHierarchyTest.cs  |   39 ++++++++++++++--
+ 7 files changed, 142 insertions(+), 15 deletions(-)
+
+commit 00ec2feace9aa04110983c15b000abb870b5018f
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Sun Feb 14 15:10:44 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/UIAutomationClientTests/Makefile.am:
+    	Fix build error of UIAutomationClientTests (bug#579635)
+    
+    svn path=/trunk/uia2atk/; revision=151721
+
+ UIAutomation/ChangeLog                             |    5 +++++
+ .../UIAutomationClientTests/Makefile.am            |   12 +++++++++++-
+ 2 files changed, 16 insertions(+), 1 deletions(-)
+
+commit 169d375e37d9d7258390f62a6db39c7f9822da20
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Fri Feb 12 10:43:14 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClient/Makefile.am:
+    	* UIAutomationClient/UIAutomationClient.csproj:
+    	* UIAutomationClientTests/UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClient/System.Windows.Automation/ClientSettings.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/LocalProviderTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs:
+    	* UIAutomationClient/System.Windows.Automation/ClientSideProviderDescription.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	API stub for ClientSettings and related data structure, tests for
+    	AutomationElement.FromLocalProvider.
+    
+    svn path=/trunk/uia2atk/; revision=151600
+
+ UIAutomation/ChangeLog                             |   13 +
+ UIAutomation/UIAutomationClient/Makefile.am        |    2 +
+ .../System.Windows.Automation/ClientSettings.cs    |   72 +++++
+ .../ClientSideProviderDescription.cs               |   68 +++++
+ .../UIAutomationClient/UIAutomationClient.csproj   |    6 +
+ .../AutomationElementTest.cs                       |    1 -
+ .../UIAutomationClientTests/LocalProviderTest.cs   |  290 ++++++++++++++++++++
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests.csproj                 |    6 +-
+ 9 files changed, 457 insertions(+), 2 deletions(-)
+
+commit 8283493d1685be8702691cb2e89da60854f47e06
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Fri Feb 12 10:26:43 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/SampleForm/Form1.cs:
+    	* UIAutomationClient/System.Windows.Automation/Automation.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs:
+    	* UIAutomationClient/System.Windows.Automation/AutomationElement.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/RootElementTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/AutomationEventTest.cs:
+    	UIA Events for AutomationElement.RootElement
+    
+    In UiaDbus/:
+    	* UiaDbusSource/Makefile.am:
+    	* UiaDbusBridge/Application.cs:
+    	* UiaDbusBridge/AutomationBridge.cs:
+    	* UiaDbus/Interfaces/IApplication.cs:
+    	* UiaDbusSource/UiaDbusSource.csproj:
+    	* UiaDbusSource/EventHandlerManager.cs:
+    	* UiaDbusSource/UiaDbusAutomationSource.cs:
+    	* UiaDbusSource/RootElementEventsManager.cs:
+    	* UiaDbusBridge/Wrappers/ProviderElementWrapper.cs: UIA events for
+    	AutomationElement.RootElement
+    
+    svn path=/trunk/uia2atk/; revision=151597
+
+ UIAutomation/ChangeLog                             |   10 ++
+ .../System.Windows.Automation/Automation.cs        |  118 +++++++++++++-----
+ .../System.Windows.Automation/AutomationElement.cs |   16 ++-
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    4 +-
+ .../UIAutomationClientTests/AutomationEventTest.cs |  111 +++++++++++++++++
+ .../UIAutomationClientTests/BaseTest.cs            |   14 ++
+ .../UIAutomationClientTests/RootElementTest.cs     |  126 +++++++++++++++++++-
+ 7 files changed, 355 insertions(+), 44 deletions(-)
+
+commit c6c8c4f3b6685dd49ef99566b7af098be99d07dc
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Feb 10 16:35:54 2010 +0000
+
+    Updated for the 1.8.94 release
+    
+    svn path=/trunk/uia2atk/; revision=151238
+
+ UIAutomation/NEWS         |   38 ++++++++++++++++++++++++++++++++------
+ UIAutomation/configure.ac |    2 +-
+ 2 files changed, 33 insertions(+), 7 deletions(-)
+
+commit 218ca13d1fb65fa4a90ed3217727230b0fddb6f7
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Tue Feb 9 22:49:48 2010 +0000
+
+    * Element.cs, TextEventHandler.cs, Makefile.am: Add TextEventHandler.
+    
+    * UIAutomationClientTests/TextPatternTest.cs: Work around at-spi
+    sending two TextChanged events when text is replaced.
+    
+    svn path=/trunk/uia2atk/; revision=151150
+
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    5 +++++
+ .../UIAutomationClientTests/TextPatternTest.cs     |    6 +++++-
+ 2 files changed, 10 insertions(+), 1 deletions(-)
+
+commit 7cfa1399da3d6d967b45c7283e7a8030fdf5b321
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Sun Feb 7 12:35:20 2010 +0000
+
+    * GridEventhandler.cs, rangeValueEventhandler.cs,
+    SelectionEventhandler.cs, ValueEventhandler.cs: Track at-spi-sharp api.
+    
+    * ExpandCollapseSource.cs, Element.cs, AutomationSource.cs,
+    Makefile.am: Add ExpandCollapse.
+    
+    * DataItemElement.cs, TableElement.cs, TreeItemElement.cs:
+    Adjust table row indices when rows are added or removed.
+    
+    * element.cs: Fix GetSupportedPatterns();
+    
+    * GtkForm/GtkForm.cs: Initially collapse tree view.
+    
+    * GtkForm/GtkForm.cs: Support creating Toggle cell renderers.
+    
+    * UIAutomationClientTests/ExpandCollapsePatternTest.cs: Add event test.
+    
+    * AtspiUiaClientTests/EpandCollapsePatternTest.cs,
+    AtspiUiaClientTests/Makefile.am: Add ExpandCollapsePatternTest.
+    
+    svn path=/trunk/uia2atk/; revision=150998
+
+ .../ExpandCollapsePatternTest.cs                   |   49 +++++++++++++++
+ .../AtspiUiaClientTests/Makefile.am                |    1 +
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   11 +++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |   13 +++-
+ .../ExpandCollapsePatternTest.cs                   |   65 +++++++++++++++++++-
+ 5 files changed, 134 insertions(+), 5 deletions(-)
+
+commit b615705ddf3390739d1fa95e14cb4f820a03833f
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Feb 4 07:21:18 2010 +0000
+
+    In AtspiUiaSource/:
+    	* AtspiUiaSource/Element.cs: AutomationElement.FromPoint, add
+    	IElement.GetDescendantFromPoint method
+    
+    In UIAutomation/:
+    	* configure.ac:
+    	* UIAutomationClient/Makefile.am:
+    	* UIAutomationClientTests/SampleForm/Form1.cs:
+    	* UIAutomationClient/UIAutomationClient.csproj:
+    	* UIAutomationSource/Mono.UIAutomation.Source/IElement.cs:
+    	* UIAutomationClient/System.Windows.Automation/NativeMethods.cs:
+    	* UIAutomationClient/System.Windows.Automation/DesktopElement.cs:
+    	* UIAutomationClient/System.Windows.Automation/AutomationElement.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs:
+    	AutomationElement.FromPoint
+    
+    In UiaDbus/:
+    	* UiaDbus/Rect.cs:
+    	* UiaDbusSource/UiaDbusElement.cs:
+    	* UiaDbusBridgeTests/UiaDbusRectTest.cs:
+    	* UiaDbus/Interfaces/IAutomationElement.cs:
+    	* UiaDbusBridge/Wrappers/ProviderElementWrapper.cs: AutomationElement.FromPoint
+    
+    svn path=/trunk/uia2atk/; revision=150836
+
+ UIAutomation/ChangeLog                             |   13 ++
+ UIAutomation/UIAutomationClient/Makefile.am        |    4 +-
+ .../System.Windows.Automation/AutomationElement.cs |   15 ++-
+ .../System.Windows.Automation/DesktopElement.cs    |   12 +-
+ .../System.Windows.Automation/NativeMethods.cs     |  154 ++++++++++++++++++++
+ .../UIAutomationClient/UIAutomationClient.csproj   |    2 +
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   11 ++
+ .../AutomationElementTest.cs                       |   65 ++++++++
+ .../Mono.UIAutomation.Source/IElement.cs           |    2 +
+ UIAutomation/configure.ac                          |    1 +
+ 10 files changed, 274 insertions(+), 5 deletions(-)
+
+commit 85df3164fe03d56ff1eef88fc6507398673fff92
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Wed Feb 3 17:14:11 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/SampleForm/Form1.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/AutomationEventTest.cs:
+    	Correct the Type of the AutomationPropertyChangedEventArgs's old/new value.
+    
+    In UiaDbus/:
+    	* UiaDbus/Makefile.am:
+    	* UiaDbus/UiaDbus.csproj:
+    	* UiaDbus/DbusSerializer.cs:
+    	* UiaDbusBridge/Application.cs:
+    	* UiaDbusBridge/AutomationBridge.cs:
+    	* UiaDbusSource/UiaDbusAutomationSource.cs: Correct the Type of the
+    	AutomationPropertyChangedEventArgs's old/new value.
+    
+    svn path=/trunk/uia2atk/; revision=150772
+
+ UIAutomation/ChangeLog                             |    6 +
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    6 +
+ .../UIAutomationClientTests/AutomationEventTest.cs |  109 ++++++++++++++++++++
+ 3 files changed, 121 insertions(+), 0 deletions(-)
+
+commit c0c43912fc7024e9f59066da7405d98c1524f4c9
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Tue Feb 2 02:24:03 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationTypes/Makefile.am:
+    	* UIAutomationTypes/UIAutomationTypes.csproj:
+    	* UIAutomationTypes/System.Windows.Automation/ControlType.cs: i18n
+    	support for LocalizedControlType
+    
+    In UIAutomationWinforms/:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/Helper.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/FormProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/PaneProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/LabelProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ListBoxProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/TabPageProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/TextBoxProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ToolBarProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/CheckBoxProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ComboBoxProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/GroupBoxProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ListItemProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ListViewProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/MainMenuProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/MenuItemProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/SplitterProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/TrackBarProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/TreeViewProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/LinkLabelProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/MenuStripProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ScrollBarProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/StatusBarProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ToolStripProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/PictureBoxProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/TabControlProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/UpDownBaseProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/WebBrowserProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ContextMenuProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/PopupButtonProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ProgressBarProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/RadioButtonProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/StatusStripProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ToolTipBaseProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridViewProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/SimpleControlProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ToolStripItemProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/DateTimePickerProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/MessageBoxFormProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/SplitContainerProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ToolStripLabelProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ToolStripButtonProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/BaseColorControlProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ContextMenuStripProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/PopupButtonPanelProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/PropertyGridViewProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ToolStripSeparatorProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/PrintPreviewControlProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ToolStripSplitButtonProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarDataGridProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarListItemProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/Button/InvokeProviderBehavior.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/ComboBox/ButtonInvokeBehavior.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/TrackBar/ButtonInvokeProviderBehavior.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/ScrollBar/ButtonInvokeProviderBehavior.cs:
+    	to retrun LocalizedControlType by ControlType
+    
+    svn path=/trunk/uia2atk/; revision=150689
+
+ UIAutomation/ChangeLog                             |    7 ++
+ UIAutomation/UIAutomationTypes/Makefile.am         |    3 +-
+ .../System.Windows.Automation/ControlType.cs       |   79 ++++++++++----------
+ .../UIAutomationTypes/UIAutomationTypes.csproj     |    1 +
+ 4 files changed, 50 insertions(+), 40 deletions(-)
+
+commit 8a1078e0f351ba94ade46dd3acc1a0f05f5f6eda
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Sat Jan 30 04:09:32 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClient/System.Windows.Automation/Automation.cs:
+    	* UIAutomationClient/System.Windows.Automation/TreeWalker.cs:
+    	* UIAutomationClient/System.Windows.Automation/SourceManager.cs: Fix thread safety issues
+    
+    In UIAutomationWinforms/:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/Helper.cs: Fix thread safety issues
+    
+    In UiaDbus/:
+    	* UiaDbusSource/UiaDbusAutomationSource.cs: Fix thread safety issues
+    
+    svn path=/trunk/uia2atk/; revision=150592
+
+ UIAutomation/ChangeLog                             |    6 +++
+ .../System.Windows.Automation/Automation.cs        |   26 ++++++++-----
+ .../System.Windows.Automation/SourceManager.cs     |   37 ++++++++++++--------
+ .../System.Windows.Automation/TreeWalker.cs        |    6 +--
+ 4 files changed, 46 insertions(+), 29 deletions(-)
+
+commit 4a16f767c3f298da2acbf512035c894fcc005b81
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Fri Jan 22 06:35:52 2010 +0000
+
+    In AtspiUiaSource/:
+    	* AtspiUiaSource/Element.cs:
+    	* AtspiUiaSource/AutomationSource.cs: Implement IElement.AutomationSource
+    
+    In UIAutomation/:
+    	* UIAutomationSource/Mono.UIAutomation.Source/IElement.cs:
+    	* UIAutomationClient/System.Windows.Automation/Automation.cs:
+    	* UIAutomationClient/System.Windows.Automation/TreeWalker.cs:
+    	* UIAutomationClient/System.Windows.Automation/DesktopElement.cs:
+    	Allow find IAutomatioSource by IElement, to enhance the performance of several client APIs.
+    
+    In UiaDbus/:
+    	* UiaDbusSource/UiaDbusElement.cs: Implement IElement.AutomationSource
+    
+    svn path=/trunk/uia2atk/; revision=150043
+
+ UIAutomation/ChangeLog                             |    8 ++
+ .../System.Windows.Automation/Automation.cs        |   68 ++++++++++----------
+ .../System.Windows.Automation/DesktopElement.cs    |    5 ++
+ .../System.Windows.Automation/TreeWalker.cs        |   33 ++++++++--
+ .../Mono.UIAutomation.Source/IElement.cs           |    2 +
+ 5 files changed, 77 insertions(+), 39 deletions(-)
+
+commit d9ad245f872c06189561953294923ae6c4c40025
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Jan 20 13:59:49 2010 +0000
+
+    Prep for 1.8.93 release
+    
+    svn path=/trunk/uia2atk/; revision=149905
+
+ UIAutomation/NEWS         |    8 ++++++++
+ UIAutomation/configure.ac |    2 +-
+ 2 files changed, 9 insertions(+), 1 deletions(-)
+
+commit eb6936a16403a8a92bad19d99f5b294ddc792abe
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Wed Jan 20 11:06:34 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs: unit tests for bug#570621 and bug#571711
+    
+    In UIAutomationWinforms/:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ComboBoxProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ListItemProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/ScrollBarProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/DataGridViewProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/PropertyGridViewProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarDataGridProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms/MonthCalendarListItemProvider.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DataGrid/DataItemValueProviderBehavior.cs:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/DomainUpDown/ListItemValueProviderBehavior.cs: Fix bug#570621 and bug#571711
+    
+    In UiaDbus/:
+    	* UiaDbusBridge/AutomationBridge.cs: Fix bug#570621
+    
+    svn path=/trunk/uia2atk/; revision=149891
+
+ UIAutomation/ChangeLog                             |    4 +++
+ .../AutomationElementTest.cs                       |   21 ++++++++++++++++++++
+ 2 files changed, 25 insertions(+), 0 deletions(-)
+
+commit 34c13c18cf3219210493d257f8715b90ccc75101
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Thu Jan 14 16:22:09 2010 +0000
+
+    Prep for the 1.8.92 release "chocoholic"
+    
+    svn path=/trunk/uia2atk/; revision=149563
+
+ UIAutomation/NEWS         |   13 +++++++++++++
+ UIAutomation/configure.ac |    2 +-
+ 2 files changed, 14 insertions(+), 1 deletions(-)
+
+commit 2c1c16a28506604ef68c757814f33df04d95ede1
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Jan 14 10:12:33 2010 +0000
+
+    In AtspiUiaSource/:
+    	* AtspiUiaSource/Element.cs: Add empty method stub for AutomationElement.SupportedProperties
+    
+    In UIAutomation/:
+    	* UIAutomationSource/Mono.UIAutomation.Source/IElement.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs:
+    	* UIAutomationClient/System.Windows.Automation/DesktopElement.cs:
+    	* UIAutomationClient/System.Windows.Automation/AutomationElement.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs: AutomationElement.SupportedProperties
+    
+    In UIAutomationWinforms/:
+    	* UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/ListView/TableProviderBehavior.cs:
+    	Fix the bug of not returning RowOrColumnMajorProperty
+    
+    In UiaDbus/:
+    	* UiaDbusSource/UiaDbusElement.cs:
+    	* UiaDbus/Interfaces/IAutomationElement.cs:
+    	* UiaDbusBridge/Wrappers/ProviderElementWrapper.cs: AutomationElement.SupportedProperties
+    
+    svn path=/trunk/uia2atk/; revision=149539
+
+ UIAutomation/ChangeLog                             |    8 +++++
+ .../System.Windows.Automation/AutomationElement.cs |    4 +-
+ .../System.Windows.Automation/DesktopElement.cs    |   31 ++++++++++++++++++
+ .../AutomationElementTest.cs                       |   33 +++++++++++++++++++-
+ .../UIAutomationClientTests/BaseTest.cs            |   19 +++++++++++-
+ .../Mono.UIAutomation.Source/IElement.cs           |    4 ++-
+ 6 files changed, 94 insertions(+), 5 deletions(-)
+
+commit 184af9a2930d023e0b68a88bafe657e8d583c054
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Wed Jan 13 03:58:16 2010 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClient/System.Windows.Automation/AutomationElement.cs:
+    	Improve AutomationElement.GetHashCode
+    
+    svn path=/trunk/uia2atk/; revision=149434
+
+ UIAutomation/ChangeLog                             |    5 +++++
+ .../System.Windows.Automation/AutomationElement.cs |    4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 15f928e648ad1ff44ecc1ee74744ecbcabaa9217
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Tue Dec 15 00:32:04 2009 +0000
+
+    In AtspiUiaSource/AtspiUiaSource/:
+    	* GridSource.cs:
+    	* TableSource.cs:
+    	* ValueSource.cs:
+    	* GridItemSource.cs:
+    	* SelectionSource.cs:
+    	* TableItemSource.cs:
+    	* RangeValueSource.cs:
+    	* SelectionItemSource.cs:
+    	* SelectionEventHandler.cs: Update for latest interfaces changes.
+    
+    In UIAutomation/UIAutomationClient/:
+    	* System.Windows.Automation/DockPattern.cs:
+    	* System.Windows.Automation/GridPattern.cs:
+    	* System.Windows.Automation/CacheRequest.cs:
+    	* System.Windows.Automation/TablePattern.cs:
+    	* System.Windows.Automation/ValuePattern.cs:
+    	* System.Windows.Automation/ScrollPattern.cs:
+    	* System.Windows.Automation/TogglePattern.cs:
+    	* System.Windows.Automation/WindowPattern.cs:
+    	* System.Windows.Automation/GridItemPattern.cs:
+    	* System.Windows.Automation/SelectionPattern.cs:
+    	* System.Windows.Automation/TableItemPattern.cs:
+    	* System.Windows.Automation/TransformPattern.cs:
+    	* System.Windows.Automation/RangeValuePattern.cs:
+    	* System.Windows.Automation/MultipleViewPattern.cs:
+    	* System.Windows.Automation/SelectionItemPattern.cs:
+    	* System.Windows.Automation/ExpandCollapsePattern.cs: Implement caching.
+    	* System.Windows.Automation/TreeWalker.cs: Implement caching methods.
+    	* System.Windows.Automation/TreeWalker.TreeIterator.cs: Make sure to use
+    	a new instance instead of reusing AutomationElement.RootElement.
+    	* System.Windows.Automation/SourceManager.cs: Update GetOrCreate*
+    	methods to always create new instances (will rename later).
+    	* System.Windows.Automation/AutomationElement.cs: Implement caching.
+    	* System.Windows.Automation/AutomationElement.AutomationElementInformation.cs:
+    	Add caching support, and ensure that Current property always returns
+    	up-to-date values.
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* UIAutomationClientTests/TreeWalkerTest.cs: Update tests to confirm
+    	that new AutomationElement instances are always returned.
+    	* UIAutomationClientTests/WindowPatternTest.cs: Update tests of
+    	Current property.
+    	* UIAutomationClientTests/AutomationElementTest.cs: Update tests for
+    	GetCurrentPattern and FindFirst.
+    	* UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClientTests/CacheRequestTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests.csproj: Add initial
+    	tests of CacheRequest class, and caching behavior in general.
+    
+    In UIAutomation/UIAutomationSource/:
+    	* Mono.UIAutomation.Source/IGridPattern.cs:
+    	* Mono.UIAutomation.Source/ITablePattern.cs:
+    	* Mono.UIAutomation.Source/IValuePattern.cs:
+    	* Mono.UIAutomation.Source/IScrollPattern.cs:
+    	* Mono.UIAutomation.Source/IWindowPattern.cs:
+    	* Mono.UIAutomation.Source/IGridItemPattern.cs:
+    	* Mono.UIAutomation.Source/ISelectionPattern.cs:
+    	* Mono.UIAutomation.Source/ITableItemPattern.cs:
+    	* Mono.UIAutomation.Source/ITransformPattern.cs:
+    	* Mono.UIAutomation.Source/IRangeValuePattern.cs:
+    	* Mono.UIAutomation.Source/IMultipleViewPattern.cs:
+    	* Mono.UIAutomation.Source/ISelectionItemPattern.cs: Update interfaces
+    	to no longer use *Properties structs. Add properties as necessary.
+    
+    In UiaDbus/:
+    	* UiaDbusSource/UiaDbusGridPattern.cs:
+    	* UiaDbusSource/UiaDbusTablePattern.cs:
+    	* UiaDbusSource/UiaDbusValuePattern.cs:
+    	* UiaDbusSource/UiaDbusScrollPattern.cs:
+    	* UiaDbusSource/UiaDbusWindowPattern.cs:
+    	* UiaDbusSource/UiaDbusGridItemPattern.cs:
+    	* UiaDbusSource/UiaDbusSelectionPattern.cs:
+    	* UiaDbusSource/UiaDbusTableItemPattern.cs:
+    	* UiaDbusSource/UiaDbusTransformPattern.cs:
+    	* UiaDbusSource/UiaDbusRangeValuePattern.cs:
+    	* UiaDbusSource/UiaDbusMultipleViewPattern.cs:
+    	* UiaDbusSource/UiaDbusSelectionItemPattern.cs: Update for interface
+    	changes.
+    
+    svn path=/trunk/uia2atk/; revision=148440
+
+ UIAutomation/UIAutomationClient/ChangeLog          |   33 +
+ ...tomationElement.AutomationElementInformation.cs |  104 ++-
+ .../System.Windows.Automation/AutomationElement.cs |  361 +++++---
+ .../System.Windows.Automation/CacheRequest.cs      |  151 +++-
+ .../System.Windows.Automation/DockPattern.cs       |   38 +-
+ .../ExpandCollapsePattern.cs                       |   40 +-
+ .../System.Windows.Automation/GridItemPattern.cs   |   48 +-
+ .../System.Windows.Automation/GridPattern.cs       |   42 +-
+ .../MultipleViewPattern.cs                         |   43 +-
+ .../System.Windows.Automation/RangeValuePattern.cs |   53 +-
+ .../System.Windows.Automation/ScrollPattern.cs     |   59 +-
+ .../SelectionItemPattern.cs                        |   45 +-
+ .../System.Windows.Automation/SelectionPattern.cs  |   68 +-
+ .../System.Windows.Automation/SourceManager.cs     |   10 +-
+ .../System.Windows.Automation/TableItemPattern.cs  |   55 +-
+ .../System.Windows.Automation/TablePattern.cs      |   52 +-
+ .../System.Windows.Automation/TogglePattern.cs     |   40 +-
+ .../System.Windows.Automation/TransformPattern.cs  |   48 +-
+ .../TreeWalker.TreeIterator.cs                     |    4 +-
+ .../System.Windows.Automation/TreeWalker.cs        |   42 +-
+ .../System.Windows.Automation/ValuePattern.cs      |   41 +-
+ .../System.Windows.Automation/WindowPattern.cs     |   53 +-
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   16 +
+ .../AutomationElementTest.cs                       |   18 +
+ .../UIAutomationClientTests/CacheRequestTest.cs    |  978 ++++++++++++++++++++
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests/TreeWalkerTest.cs      |   10 +
+ .../UIAutomationClientTests.csproj                 |    3 +-
+ .../UIAutomationClientTests/WindowPatternTest.cs   |    3 +
+ UIAutomation/UIAutomationSource/ChangeLog          |   16 +
+ .../Mono.UIAutomation.Source/IGridItemPattern.cs   |   15 +-
+ .../Mono.UIAutomation.Source/IGridPattern.cs       |   10 +-
+ .../IMultipleViewPattern.cs                        |   10 +-
+ .../Mono.UIAutomation.Source/IRangeValuePattern.cs |   18 +-
+ .../Mono.UIAutomation.Source/IScrollPattern.cs     |   18 +-
+ .../ISelectionItemPattern.cs                       |   10 +-
+ .../Mono.UIAutomation.Source/ISelectionPattern.cs  |   10 +-
+ .../Mono.UIAutomation.Source/ITableItemPattern.cs  |   14 +-
+ .../Mono.UIAutomation.Source/ITablePattern.cs      |   13 +-
+ .../Mono.UIAutomation.Source/ITransformPattern.cs  |   13 +-
+ .../Mono.UIAutomation.Source/IValuePattern.cs      |   10 +-
+ .../Mono.UIAutomation.Source/IWindowPattern.cs     |   22 +-
+ 42 files changed, 2094 insertions(+), 544 deletions(-)
+
+commit 888e0255983d1d504adc825dae2caf0a5341db8c
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Wed Dec 9 18:46:38 2009 +0000
+
+    Rev for the 0.8.91 release
+    
+    svn path=/trunk/uia2atk/; revision=147928
+
+ UIAutomation/NEWS         |   19 +++++++++++++++++++
+ UIAutomation/configure.ac |    2 +-
+ 2 files changed, 20 insertions(+), 1 deletions(-)
+
+commit 0b8aa2b05a64729b07c915516e6193d0c896de44
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Tue Dec 8 16:02:50 2009 +0000
+
+    2009-12-08  Mario Carrion  <mcarrion at novell.com>
+    
+    In UIAutomation/UIAutomationClient/:
+    	* System.Windows.Automation/Automation.cs: Raising ArgumentException
+    	when EventId is not valid, in RemoveAutomationEventHandler.
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* UIAutomationClientTests/AutomationTest.cs: New test
+    	RemoveAutomationEventHandlerTest, tests
+    	exception thrown Automation.RemoveAutomationEventHandler when event is
+    	not valid.
+    
+    svn path=/trunk/uia2atk/; revision=147862
+
+ UIAutomation/UIAutomationClient/ChangeLog          |    5 +
+ .../System.Windows.Automation/Automation.cs        |    6 ++
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    7 ++
+ .../UIAutomationClientTests/AutomationTest.cs      |   79 ++++++++++++++++++++
+ 4 files changed, 97 insertions(+), 0 deletions(-)
+
+commit c12b9b454dbb442b8763a9bd53fefa127ac52a81
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Fri Dec 4 01:58:28 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/SampleForm/Form1.cs:
+    	* UIAutomationClient/System.Windows.Automation/Automation.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClientTests/UIAutomationClientTests/FocusTest.cs:
+    	* UIAutomationSource/Mono.UIAutomation.Source/IAutomationSource.cs:
+    	* UIAutomationClient/System.Windows.Automation/AutomationElement.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	* UIAutomationClient/System.Windows.Automation/AutomationFocusChangedEventArgs.cs:
+    	Implement AutomationElement.FocusedElement, Automation.[Add|Remove]AutomationFocusChangedEventHandler
+    
+    In UiaDbus/:
+    	* UiaDbusBridge/Application.cs:
+    	* UiaDbusBridge/AutomationBridge.cs:
+    	* UiaDbus/Interfaces/IApplication.cs:
+    	* UiaDbusSource/UiaDbusAutomationSource.cs:
+    	Implement AutomationElement.FocusedElement, Automation.[Add|Remove]AutomationFocusChangedEventHandler
+    
+    svn path=/trunk/uia2atk/; revision=147633
+
+ UIAutomation/ChangeLog                             |   12 +++
+ .../System.Windows.Automation/Automation.cs        |   24 +++++-
+ .../System.Windows.Automation/AutomationElement.cs |   29 ++++++-
+ .../AutomationFocusChangedEventArgs.cs             |    2 +-
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    6 +-
+ .../UIAutomationClientTests/FocusTest.cs           |   89 ++++++++++++++++++++
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests.csproj                 |    3 +-
+ .../Mono.UIAutomation.Source/IAutomationSource.cs  |   11 +++
+ 9 files changed, 171 insertions(+), 6 deletions(-)
+
+commit 35c984164042a82d1fb81be838f7b149a833d939
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Thu Dec 3 16:55:27 2009 +0000
+
+    * Mono.UIAutomation.Source/IElement.cs: Add SetFocus.
+    
+    * UiaDbus/Interfaces/IAutomationElement.cs,
+    UiaDbusBridge/Wrappers/ProviderElementWrapper.cs,
+    UiaDbusSource/UiaDbusElement.cs: Implement SetFocus.
+    
+    * System.Windows.Automation/AutomationElement.cs,
+    System.Windows.Automation/DesktopElement.cs: Implement SetFocus.
+    
+    * GridItemSource.cs, tableItemSource.cs: Fetch row and column
+    individually if GetRowColumnExtents fails.
+    
+    * Element.cs: Implement SetFocus ().
+    
+    * AutomationSource.cs: Implement some PropertyChanged handlers.
+    
+    * UIAutomationClientTests/AutomationElementTest.cs,
+    AtspiUiaClientTests/AutomationElementTest.cs,
+    AtspiUiaClientTests/Makefile.am: SampleForm/Form1.cs:
+    Test some PropertyChanged events.
+    
+    * UIAutomationClientTests/BaseTest.cs, GtkForm/GtkForm.cs:
+    Change name of form to match SWF form.
+    
+    * UIAutomationClientTests/TableHierarchyTest.cs: Fix for new table.
+    
+    svn path=/trunk/uia2atk/; revision=147570
+
+ .../System.Windows.Automation/AutomationElement.cs |    2 +-
+ .../System.Windows.Automation/DesktopElement.cs    |    5 +
+ .../AtspiUiaClientTests/AutomationElementTest.cs   |   49 ++++++
+ .../AtspiUiaClientTests/Makefile.am                |    5 +-
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   12 ++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |   29 +++-
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    9 +
+ .../AutomationElementTest.cs                       |  154 ++++++++++++++++++--
+ .../UIAutomationClientTests/BaseTest.cs            |   10 +-
+ .../UIAutomationClientTests/TableHierarchyTest.cs  |   20 ++-
+ UIAutomation/UIAutomationSource/ChangeLog          |    4 +
+ .../Mono.UIAutomation.Source/IElement.cs           |    2 +
+ 12 files changed, 267 insertions(+), 34 deletions(-)
+
+commit b9b5cc828f027121fa8998e457486eb6f4d09de7
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Wed Dec 2 16:39:23 2009 +0000
+
+    2009-12-02  Mario Carrion  <mcarrion at novell.com>
+    
+    In AtspiUiaSource/AtspiUiaSource/:
+    	* Element.cs: TryCreateRangeValueElement() -> RangeValueEventHandler,
+    	TryCreateValueElement() -> ValueEventHandler, OnRowXXX()/OnColumn() ->
+    	GridEventHandler.
+    	* Makefile.am: Files renamed.
+    	* GridEventHandler.cs: Listens for Column and Row changes.
+    	* ValueElement.cs -> ValueEventHandler.cs: Renamed, implementing
+    	ISourceEventHandler.
+    	* RangeValueElement.cs -> RangeValueEventHandler.cs: Renamed,
+    	implementing ISourceEventHandler.
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* AtspiUiaClientTests/Makefile.am: Added RangeValuePatternTest.cs.
+    
+    svn path=/trunk/uia2atk/; revision=147459
+
+ .../AtspiUiaClientTests/Makefile.am                |    1 +
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    4 ++++
+ 2 files changed, 5 insertions(+), 0 deletions(-)
+
+commit e0dba9cd19d3caa7ad9d8e79e64c227d4e7f1144
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Tue Dec 1 16:43:24 2009 +0000
+
+    2009-12-01  Mario Carrion  <mcarrion at novell.com>
+    
+    In AtspiUiaSource/AtspiUiaSource/:
+    	* Element.cs: SupportsSelection() event added.
+    	* Makefile.am: Added new files.
+    	* ISourceEventHandler.cs: File added, to be implemented my
+    	Source event handlers.
+    	* SelectionEventHandler.cs: Listens SelectionChanged events to raise
+    	SelectionProperty events.
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* GtkForm/GtkForm.cs: ListView element added.
+    	* SampleForm/Form1.cs:
+    	* AtspiUiaClientTests/Makefile.am: Tests added again (removed in last
+    	commit.)
+    	* UIAutomationClientTests/BaseTest.cs: Updated to get listview
+    	element.
+    	* AtspiUiaClientTests/atspiuiaclienttest.sh.in: 'c' replaced with 'f'
+    	* UIAutomationClientTests/SelectionPatternTest.cs: Tests Selection
+    	events.
+    
+    Fixes Bug #489299. Partially Fixes Bug #558634
+    
+    svn path=/trunk/uia2atk/; revision=147243
+
+ .../AtspiUiaClientTests/Makefile.am                |    7 ++
+ .../AtspiUiaClientTests/atspiuiaclienttest.sh.in   |    2 +-
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   12 +++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |   17 +++-
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    5 +-
+ .../UIAutomationClientTests/BaseTest.cs            |   12 ++-
+ .../SelectionPatternTest.cs                        |  100 +++++++++++++++++++-
+ 7 files changed, 147 insertions(+), 8 deletions(-)
+
+commit 3abf2c2a0fe6816a6235bf2815c7d3001793f9c4
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Tue Dec 1 04:05:20 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClient/System.Windows.Automation/TreeWalker.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/Makefile.am:
+    	* UIAutomationSource/Mono.UIAutomation.Source/IAutomationSource.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/RootElementTest.cs:
+    	* UIAutomationClient/System.Windows.Automation/TreeWalker.TreeIterator.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	Make client be aware of the applications which start after the client starts.
+    
+    In UiaDbus/:
+    	* UiaDbusBridge/Application.cs:
+    	* UiaDbus/Interfaces/IApplication.cs:
+    	* UiaDbusSource/UiaDbusAutomationSource.cs:
+    	Make client be aware of the applications which start after the client starts.
+    
+    svn path=/trunk/uia2atk/; revision=147174
+
+ UIAutomation/ChangeLog                             |   10 +++
+ .../TreeWalker.TreeIterator.cs                     |   53 +++++++++-------
+ .../System.Windows.Automation/TreeWalker.cs        |   26 ++++++--
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests/RootElementTest.cs     |   65 ++++++++++++++++++++
+ .../UIAutomationClientTests.csproj                 |    3 +-
+ .../Mono.UIAutomation.Source/IAutomationSource.cs  |    2 +
+ 7 files changed, 132 insertions(+), 28 deletions(-)
+
+commit f6d2d466ea0edaef9a6a8ff4a3d6b8ad0b04ece2
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Mon Nov 30 22:37:24 2009 +0000
+
+    Updated NEWS files
+    
+    svn path=/trunk/uia2atk/; revision=147135
+
+ UIAutomation/NEWS |    3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+commit 6186f897a2efe7ba8a0fddd5c4432bf94bfbb590
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Mon Nov 30 21:40:31 2009 +0000
+
+    Updated */configure.ac to version 1.8.90 for our next release
+    
+    svn path=/trunk/uia2atk/; revision=147127
+
+ UIAutomation/configure.ac |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+commit 13d44802823cb2e0d3837e9e8c939c36a54e3c0f
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Nov 25 17:07:58 2009 +0000
+
+    Added missing file
+    
+    svn path=/trunk/uia2atk/; revision=146924
+
+ .../AtspiUiaClientTests/AutomationEventTest.cs     |   49 ++++++++++++++++++++
+ 1 files changed, 49 insertions(+), 0 deletions(-)
+
+commit 3119055a7f4b98719ee45df1d40e1218d1cdf400
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Nov 25 13:27:53 2009 +0000
+
+    * AutomationSource.cs: Finish StructureChanged events.
+    
+    * AtspiUiaClientTests/AutomationEventTest.cs,
+    AtspiUiaClientTests/Makefile.am: Add AutomationEventTest.cs.
+    
+    * GtkForm/GtkForm.cs: Remove extra Click event.
+    
+    svn path=/trunk/uia2atk/; revision=146902
+
+ .../AtspiUiaClientTests/Makefile.am                |    7 +------
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    7 +++++++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |    1 -
+ 3 files changed, 8 insertions(+), 7 deletions(-)
+
+commit 4db40ea3771b69a8f9f5e2188067ccaa0b494aeb
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Tue Nov 24 17:24:25 2009 +0000
+
+    In AtspiUiaSource/AtspiUiaSource/:
+    	* AutomationSource.cs: Add stub implementation of GetElementFromHandle.
+    
+    In UIAutomation/UIAutomationClient/:
+    	* System.Windows.Automation/AutomationElement.cs: Implement
+    	FromHandle.
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* UIAutomationClientTests/AutomationElementTest.cs: Implement test
+    	for AutomationElement.FromHandle.
+    
+    In UIAutomation/UIAutomationSource/:
+    	* Mono.UIAutomation.Source/IAutomationSource.cs: Add GetElementFromHandle.
+    
+    In UIAutomationWinforms/UIAutomationWinforms/:
+    	* Mono.UIAutomation.Winforms/FormProvider.cs:
+    	* Mono.UIAutomation.Winforms/SimpleControlProvider.cs: Support
+    	NativeWindowHandleProperty for all Control-based providers.
+    
+    In UiaDbus/:
+    	* UiaDbusBridge/Application.cs:
+    	* UiaDbus/Interfaces/IApplication.cs:
+    	* UiaDbusSource/UiaDbusAutomationSource.cs: Implement GetElementFromHandle.
+    	* UiaDbusBridge/AutomationBridge.cs: Track handles for non-window
+    	providers.
+    	* UiaDbusBridge/Wrappers/ProviderElementWrapper.cs:
+    	* UiaDbusBridgeTests/ProviderElementWrapperTest.cs: NativeWindowHandle
+    	default should be 0, not -1.
+    	* UiaDbusBridge/Wrappers/GridPatternWrapper.cs:
+    	* UiaDbusBridge/Wrappers/GridItemPatternWrapper.cs:
+    	* UiaDbusBridge/Wrappers/SelectionPatternWrapper.cs:
+    	* UiaDbusBridge/Wrappers/TextPatternRangeWrapper.cs:
+    	* UiaDbusBridge/Wrappers/SelectionItemPatternWrapper.cs: Fix typo in
+    	FindWrapperByProvider method name.
+    
+    svn path=/trunk/uia2atk/; revision=146846
+
+ UIAutomation/UIAutomationClient/ChangeLog          |    5 ++++
+ .../System.Windows.Automation/AutomationElement.cs |   12 ++++++++-
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    5 ++++
+ .../AutomationElementTest.cs                       |   25 ++++++++++++++++++++
+ UIAutomation/UIAutomationSource/ChangeLog          |    4 +++
+ .../Mono.UIAutomation.Source/IAutomationSource.cs  |    2 +
+ 6 files changed, 52 insertions(+), 1 deletions(-)
+
+commit 77b66b8a1b6cf112faef1a0c2d3a1fce8519104a
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Tue Nov 24 16:42:05 2009 +0000
+
+    In UIAutomation/UIAutomationClient/:
+    	* System.Windows.Automation/WindowPattern.cs: Implement
+    	WaitForInputIdle.
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* SampleForm/Form1.cs: Add new commands for WindowPattern.
+    	* UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClientTests/AutomationTest.cs:
+    	* UIAutomationClientTests/WindowPatternTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests.csproj: New tests
+    	for WindowPattern.
+    
+    svn path=/trunk/uia2atk/; revision=146843
+
+ UIAutomation/UIAutomationClient/ChangeLog          |    5 +
+ .../System.Windows.Automation/WindowPattern.cs     |    2 +-
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   10 +
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   22 +
+ .../UIAutomationClientTests/AutomationTest.cs      |   27 --
+ .../UIAutomationClientTests/Makefile.am            |    3 +-
+ .../UIAutomationClientTests.csproj                 |    1 +
+ .../UIAutomationClientTests/WindowPatternTest.cs   |  451 ++++++++++++++++++++
+ 8 files changed, 492 insertions(+), 29 deletions(-)
+
+commit 41fb0c53c9ca63b7673f0533e9fb2acf1fb23290
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Mon Nov 23 20:21:45 2009 +0000
+
+    2009-11-23  Mario Carrion   <mcarrion at novell.com>
+    
+    In AtspiUiaSource/AtspiUiaSource/:
+    	* Element.cs: New static method TryCreateValueElement.
+    	* Makefile.am: ValueElement.cs added.
+    	* ValueElement.cs: Raises ValuePattern.ValueProperty event.
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* UIAutomationClientTests/ValuePatternTest.cs: Updated according
+    	LAMESPEC.
+    
+    svn path=/trunk/uia2atk/; revision=146766
+
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    5 +++++
+ .../UIAutomationClientTests/ValuePatternTest.cs    |    3 ++-
+ 2 files changed, 7 insertions(+), 1 deletions(-)
+
+commit 32903c3d4e184bfa8507f3bb21ea9c583cd0e0e2
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Mon Nov 23 17:12:47 2009 +0000
+
+    * SelectionItemSource.cs: Remove unused variable.
+    
+    * AutomationSource.cs: Support Selection events.
+    
+    * Element.cs, RangeValueElement.cs, Makefile.am: Support RangeValue
+    events.
+    
+    * UIAutomationClientTests/SelectionPatternTest.cs,
+    UIAutomationClientTests/RangeValuePatternTest.cs: Add event tests.
+    
+    
+    svn path=/trunk/uia2atk/; revision=146743
+
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    5 +
+ .../RangeValuePatternTest.cs                       |   37 +++++++
+ .../SelectionPatternTest.cs                        |  107 ++++++++++++++++++--
+ 3 files changed, 140 insertions(+), 9 deletions(-)
+
+commit 67f16749b1d26882b90638b95ed33066f4f5a9b5
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Nov 18 19:34:37 2009 +0000
+
+    * AssemblyInfo.cs.in: Add InternalsVisibleTo for AtspiUiaSource.
+    
+    svn path=/trunk/uia2atk/; revision=146438
+
+ UIAutomation/UIAutomationClient/AssemblyInfo.cs.in |    1 +
+ UIAutomation/UIAutomationClient/ChangeLog          |    4 ++++
+ 2 files changed, 5 insertions(+), 0 deletions(-)
+
+commit 71ca033eb69d7d0d63c0952773ad36fdc5f1661b
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Nov 18 19:06:16 2009 +0000
+
+    Remove ExpandCollapseSource.cs from Makefile.am and remove more doubles.
+    
+    svn path=/trunk/uia2atk/; revision=146437
+
+ .../AtspiUiaClientTests/RangeValuePatternTest.cs   |   49 --------------------
+ .../AtspiUiaClientTests/SelectionPatternTest.cs    |   49 --------------------
+ 2 files changed, 0 insertions(+), 98 deletions(-)
+
+commit 8c6c85fd5aad8776b725f0ab41a3b0791493bcda
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Nov 18 17:06:46 2009 +0000
+
+    * Element.cs, RangeValueSource.cs, SelectionItemSource,
+    SelectionSource.cs, Makefile.am: Add RangeValue, Selection, and
+    SelectionItem implementations.
+    
+    * Mono.UIAutomation.Source/SelectionSource.cs: Add some properties.
+    
+    * System.Windows.Automation/SelectionPattern.cs: Support caching.
+    
+    * UIAutomationClientTests/SelectionPatternTest.cs,
+    UIAutomationClientTests/RangeValuePatternTest.cs,
+    AtspiUiaClientTests/SelectionPatternTest.cs,
+    AtspiUiaClientTests/RangeValuePatternTest.cs: Add RangeValue,
+    Selection, and SelectionItem tests for AtspiUiaSource.
+    
+    AtspiUiaClientTests/atspiuiaclienttest.sh.in: Remove GTK_MODULES.
+    
+    svn path=/trunk/uia2atk/; revision=146431
+
+ UIAutomation/UIAutomationClient/ChangeLog          |    4 +
+ .../System.Windows.Automation/SelectionPattern.cs  |   44 +++++++--
+ .../AtspiUiaClientTests/RangeValuePatternTest.cs   |   98 ++++++++++++++++++++
+ .../AtspiUiaClientTests/SelectionPatternTest.cs    |   98 ++++++++++++++++++++
+ .../AtspiUiaClientTests/atspiuiaclienttest.sh.in   |    2 -
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   10 ++
+ .../RangeValuePatternTest.cs                       |    2 +-
+ .../SelectionPatternTest.cs                        |   12 ++-
+ UIAutomation/UIAutomationSource/ChangeLog          |    4 +
+ .../Mono.UIAutomation.Source/ISelectionPattern.cs  |    3 +
+ 10 files changed, 260 insertions(+), 17 deletions(-)
+
+commit 5a2df434ea1591ed0ead6209c22b59151a4ae3c0
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Tue Nov 17 16:21:46 2009 +0000
+
+    Removed superfluous file
+    
+    svn path=/trunk/uia2atk/; revision=146355
+
+ 0 files changed, 0 insertions(+), 0 deletions(-)
+
+commit a1f728f04546d98ea97f8e10b296e7331d5528a3
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Tue Nov 17 16:16:35 2009 +0000
+
+    Added missing file
+    
+    svn path=/trunk/uia2atk/; revision=146353
+
+ .../AtspiUiaClientTests/TableTest.cs               |   49 ++++++++++++++++++++
+ 1 files changed, 49 insertions(+), 0 deletions(-)
+
+commit b033681903541f85b3c44b2072ce8446d109a8da
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Tue Nov 17 15:45:26 2009 +0000
+
+    * Element.cs, AutomationSource.cs, GridItemSource.cs,
+    TableItemSource.cs: Add event infrastructure and support for
+    	Toggle and table events.
+    
+    * UIAutomationClientTests/TogglePatternTest.cs,
+    UIAutomationClientTests/TableTest.cs:
+    Test at-spi events.
+    
+    * GtkForm/GtkForm.cs, AtspiUiaClientTests/Makefile.am,
+    AtspiUiaClientTests/TableTest.cs: Use the UIAutomationClientTests
+    TablePattern test.
+    
+    svn path=/trunk/uia2atk/; revision=146352
+
+ .../AtspiUiaClientTests/Makefile.am                |    2 +-
+ .../AtspiUiaClientTests/TablePatternTest.cs        |  111 --------------------
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   10 ++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |   26 +++--
+ .../UIAutomationClientTests/TableTest.cs           |   10 ++-
+ .../UIAutomationClientTests/TogglePatternTest.cs   |    3 +-
+ 6 files changed, 36 insertions(+), 126 deletions(-)
+
+commit 9b8ccb349729c5c4944a003401effcccb2a31623
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Mon Nov 16 16:20:26 2009 +0000
+
+    In UIAutomation/UIAutomationClient/:
+    	* System.Windows.Automation/TreeWalker.TreeIterator.cs:
+    	Improve previous patch to get UIA Verify working with one app.
+    
+    svn path=/trunk/uia2atk/; revision=146269
+
+ UIAutomation/UIAutomationClient/ChangeLog          |    5 +++++
+ .../TreeWalker.TreeIterator.cs                     |   16 ++++++++--------
+ 2 files changed, 13 insertions(+), 8 deletions(-)
+
+commit 6f6800920b22e82261373e18a7bae79de72f0458
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Thu Nov 12 21:48:58 2009 +0000
+
+    In UIAutomation/UIAutomationClient/:
+    	* System.Windows.Automation/TreeWalker.TreeIterator.cs:
+    	When in doubt, get parent element using GetParent calls.
+    
+    svn path=/trunk/uia2atk/; revision=146065
+
+ UIAutomation/UIAutomationClient/ChangeLog          |    4 ++++
+ .../TreeWalker.TreeIterator.cs                     |    4 ++--
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 5ecdcce3d58e05aa7f7a68c256454ce8fe930178
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Tue Nov 10 05:45:34 2009 +0000
+
+    In UIAutomation/UIAutomationClientTests/:
+    	* UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/InvokePatternTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs:
+    	Fix tests to work with latest changes to SampleForm.
+    
+    svn path=/trunk/uia2atk/; revision=145805
+
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    7 +++++++
+ .../AutomationElementTest.cs                       |    4 ++--
+ .../UIAutomationClientTests/BaseTest.cs            |    8 ++++----
+ .../UIAutomationClientTests/InvokePatternTest.cs   |    8 +++++---
+ 4 files changed, 18 insertions(+), 9 deletions(-)
+
+commit 09f25feb8f517e4598de7a8ccb26d7c0c99b9894
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Fri Nov 6 15:01:12 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs:
+    	Minor fixes on BaseTest.cs: (a) Remove three wrong assertions (b) Make AssertRaises<T> public static
+    
+    svn path=/trunk/uia2atk/; revision=145591
+
+ UIAutomation/ChangeLog                             |    5 +++++
+ .../UIAutomationClientTests/BaseTest.cs            |   13 ++-----------
+ 2 files changed, 7 insertions(+), 11 deletions(-)
+
+commit 02ae6ebcbf7e17426edc1b7471bcf8df601bb337
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Fri Nov 6 14:51:12 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/SampleForm/Form1.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClientTests/UIAutomationClientTests/ScrollTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	Test ScrollPattern/ScrollItemPattern
+    
+    svn path=/trunk/uia2atk/; revision=145590
+
+ UIAutomation/ChangeLog                             |    9 +
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   35 +-
+ .../UIAutomationClientTests/BaseTest.cs            |    6 -
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests/ScrollTest.cs          |  412 ++++++++++++++++++++
+ .../UIAutomationClientTests.csproj                 |    3 +-
+ 6 files changed, 446 insertions(+), 20 deletions(-)
+
+commit d503515692e07b1d051668df8b60744764fa25aa
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Thu Nov 5 19:41:46 2009 +0000
+
+    In UIAutomation/UIAutomationClientTests/:
+    	* UIAutomationClientTests/BaseTest.cs: Add new AssertRaises<T>.
+    	* UIAutomationClientTests/ConditionTest.cs:
+    	* UIAutomationClientTests/TreeWalkerTest.cs:
+    	* UIAutomationClientTests/TransformPatternTest.cs:
+    	* UIAutomationClientTests/AutomationElementTest.cs: Convert uses of
+    	try/catch/Assert.IsTrue pattern to AssertRaises<T> calls.
+    
+    svn path=/trunk/uia2atk/; revision=145532
+
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    9 +++
+ .../AutomationElementTest.cs                       |   40 ++++--------
+ .../UIAutomationClientTests/BaseTest.cs            |   13 ++++
+ .../UIAutomationClientTests/ConditionTest.cs       |   26 ++-----
+ .../TransformPatternTest.cs                        |   46 ++++---------
+ .../UIAutomationClientTests/TreeWalkerTest.cs      |   70 ++++++--------------
+ 6 files changed, 76 insertions(+), 128 deletions(-)
+
+commit 061c474b34465b095d6c5e250ff2c24432e8182c
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Thu Nov 5 17:42:42 2009 +0000
+
+    In /:
+    	* uia2atk.mdw: Convert from obsolete MonoDevelop file formats to
+    	msbuild.
+    In MoonAtkBridge/:
+    	* MoonAtkBridge.sln:
+    	* MoonAtkBridge/MoonAtkBridge.csproj: Convert from obsolete
+    	MonoDevelop file formats to msbuild.
+    
+    In MoonAtkBridge/tests/:
+    	* tests.mdproj: Convert from obsolete MonoDevelop file formats
+    	to msbuild.
+    
+    In UIAutomation/:
+    	* UIAutomation.sln:
+    	* UIAutomationTypes/Makefile.am:
+    	* UIAutomationBridge/Makefile.am:
+    	* UIAutomationProvider/Makefile.am:
+    	* UIAutomationTypes/UIAutomationTypes.csproj:
+    	* UIAutomationBridge/UIAutomationBridge.csproj:
+    	* UIAutomationClient/UIAutomationClient.csproj:
+    	* UIAutomationSource/UIAutomationSource.csproj:
+    	* UIAutomationProvider/UIAutomationProvider.csproj:
+    	* UIAutomationTypes/Test/UIAutomationTypesTests.sln:
+    	* UIAutomationClientTests/UIAutomationClientTests.sln:
+    	* UIAutomationProvider/Test/UIAutomationProviderTests.sln:
+    	* UIAutomationProvider/Test/UIAutomationProviderTests.csproj:
+    	* UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	Convert from obsolete MonoDevelop file formats to msbuild.
+    	Modify some makefiles to accomodate file sync to MD projects.
+    
+    In UIAutomationWinforms/:
+    	* UIAutomationWinforms.sln:
+    	* UIAutomationWinforms/UIAutomationWinforms.csproj:
+    	* UIAutomationWinformsTests/UIAutomationWinformsTests.csproj:
+    	Convert from obsolete MonoDevelop file formats to msbuild.
+    
+    In UiaAtkBridge/:
+    	* UiaAtkBridge.sln:
+    	* Test/AtkTest/AtkTest.csproj:
+    	* Test/GailTest/GailTest.csproj:
+    	* bridge-glue/bridge-glue.cproj:
+    	* UiaAtkBridge/UiaAtkBridge.csproj:
+    	* Test/GailTestApp/GailTestApp.csproj:
+    	* samples/managed/FormTest/FormTest.csproj:
+    	* Test/UiaAtkBridgeTest/UiaAtkBridgeTest.csproj:
+    	* samples/unmanaged/atkHelloWorld/atkHelloWorld.cproj:
+    	* samples/managed/atkSharpHelloWorld/atkSharpHelloWorld.csproj:
+    	Convert from obsolete MonoDevelop file formats to msbuild.
+    
+    In UiaDbus/:
+    	* UiaDbus.sln:
+    	* UiaDbus/UiaDbus.csproj:
+    	* UiaDbusBridge/UiaDbusBridge.csproj:
+    	* UiaDbusSource/UiaDbusSource.csproj:
+    	* UiaDbusBridgeTests/UiaDbusBridgeTests.csproj:
+    	Convert from obsolete MonoDevelop file formats to msbuild.
+    
+    svn path=/trunk/uia2atk/; revision=145500
+
+ UIAutomation/ChangeLog                             |   19 ++++
+ UIAutomation/UIAutomation.mds                      |   33 ------
+ UIAutomation/UIAutomation.sln                      |   52 +++++++++
+ UIAutomation/UIAutomationBridge/Makefile.am        |    9 +-
+ .../UIAutomationBridge/UIAutomationBridge.csproj   |   62 +++++++++++
+ .../UIAutomationBridge/UIAutomationBridge.mdp      |   35 ------
+ .../UIAutomationClient/UIAutomationClient.csproj   |  104 ++++++++++++++++++
+ .../UIAutomationClient/UIAutomationClient.mdp      |   70 ------------
+ .../SampleForm/SampleForm.csproj                   |    4 +-
+ .../UIAutomationClientTests.sln                    |    3 +
+ .../UIAutomationClientTests.csproj                 |    8 +-
+ UIAutomation/UIAutomationProvider/Makefile.am      |    3 +
+ .../Test/UIAutomationProviderTests.csproj          |    5 +-
+ .../Test/UIAutomationProviderTests.sln             |    3 +
+ .../UIAutomationProvider.csproj                    |   95 ++++++++++++++++
+ .../UIAutomationProvider/UIAutomationProvider.mdp  |   65 -----------
+ .../UIAutomationProviderTests.mdp                  |   38 -------
+ .../UIAutomationSource/UIAutomationSource.csproj   |   76 +++++++++++++
+ .../UIAutomationSource/UIAutomationSource.mdp      |   48 --------
+ UIAutomation/UIAutomationTypes/Makefile.am         |   33 +++---
+ .../Test/UIAutomationTypesTests.csproj             |    7 +-
+ .../Test/UIAutomationTypesTests.sln                |    3 +
+ .../UIAutomationTypes/UIAutomationTypes.csproj     |  113 ++++++++++++++++++++
+ .../UIAutomationTypes/UIAutomationTypes.mdp        |   87 ---------------
+ .../UIAutomationTypes/UIAutomationTypesTests.mdp   |   76 -------------
+ 25 files changed, 569 insertions(+), 482 deletions(-)
+
+commit d1f1bbf2cc5913439b5d4b5c7a2d0f524a2d4c96
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Nov 5 16:21:01 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/SampleForm/Form1.cs:
+    	* UIAutomationClientTests/SampleForm/Form1.Designer.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClientTests/UIAutomationClientTests/ValuePatternTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/TogglePatternTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/RangeValuePatternTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/MultipleViewPatternTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	Implement/Test MultipleViewPattern
+    
+    In UiaDbus/:
+    	* UiaDbus/Makefile.am:
+    	* UiaDbus/UiaDbus.mdp:
+    	* UiaDbusBridge/Makefile.am:
+    	* UiaDbusSource/Makefile.am:
+    	* UiaDbusBridge/UiaDbusBridge.mdp:
+    	* UiaDbusSource/UiaDbusElement.cs:
+    	* UiaDbusSource/UiaDbusSource.mdp:
+    	* UiaDbusSource/UiaDbusGridPattern.cs:
+    	* UiaDbusSource/UiaDbusRangeValuePattern.cs:
+    	* UiaDbus/Interfaces/IMultipleViewPattern.cs:
+    	* UiaDbusSource/UiaDbusMultipleViewPattern.cs:
+    	* UiaDbusBridge/Wrappers/ProviderElementWrapper.cs:
+    	* UiaDbusBridge/Wrappers/MultipleViewPatternWrapper.cs:
+    	Implement MultipleViewPattern
+    
+    svn path=/trunk/uia2atk/; revision=145491
+
+ UIAutomation/ChangeLog                             |   13 ++
+ .../SampleForm/Form1.Designer.cs                   |   12 ++
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   22 +++
+ .../UIAutomationClientTests/BaseTest.cs            |   42 +++++-
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../MultipleViewPatternTest.cs                     |  172 ++++++++++++++++++++
+ .../RangeValuePatternTest.cs                       |   12 +-
+ .../UIAutomationClientTests/TogglePatternTest.cs   |   11 +-
+ .../UIAutomationClientTests.csproj                 |    4 +-
+ .../UIAutomationClientTests/ValuePatternTest.cs    |    4 +-
+ 10 files changed, 276 insertions(+), 17 deletions(-)
+
+commit 95212bd1ce414eeace07b6a7216f3fdd0e06a807
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Nov 5 15:31:38 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomationSource/UIAutomationSource.mdp:
+    	* UIAutomationClientTests/SampleForm/Form1.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/TogglePatternTest.cs:
+    	Implement/Test TogglePattern
+    
+    In UiaDbus/:
+    	* UiaDbus/Makefile.am:
+    	* UiaDbus/UiaDbus.mdp:
+    	* UiaDbusBridge/Makefile.am:
+    	* UiaDbusSource/Makefile.am:
+    	* UiaDbusBridge/UiaDbusBridge.mdp:
+    	* UiaDbusSource/UiaDbusElement.cs:
+    	* UiaDbusSource/UiaDbusSource.mdp:
+    	* UiaDbus/Interfaces/ITogglePattern.cs:
+    	* UiaDbusSource/UiaDbusTogglePattern.cs:
+    	* UiaDbusBridge/Wrappers/TogglePatternWrapper.cs:
+    	* UiaDbusBridge/Wrappers/ProviderElementWrapper.cs: Implement TogglePattern
+    
+    svn path=/trunk/uia2atk/; revision=145484
+
+ UIAutomation/ChangeLog                             |    7 +++
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    4 ++
+ .../UIAutomationClientTests/TogglePatternTest.cs   |   41 ++++++++++++++++++--
+ .../UIAutomationSource/UIAutomationSource.mdp      |   25 ++++++++++--
+ 4 files changed, 68 insertions(+), 9 deletions(-)
+
+commit 0d60399d35a3ecba9b0e4375d489d15491bcbac1
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Nov 5 14:58:15 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/SampleForm/Form1.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/RangeValuePatternTest.cs:
+    	Tests for RangeValuePattern
+    
+    In UiaDbus/:
+    	* UiaDbusSource/UiaDbusElement.cs:
+    	* UiaDbusSource/UiaDbusDockPattern.cs:
+    	* UiaDbusSource/UiaDbusTextPattern.cs:
+    	* UiaDbusSource/UiaDbusScrollPattern.cs:
+    	* UiaDbusSource/UiaDbusTextPatternRange.cs:
+    	* UiaDbusSource/UiaDbusRangeValuePattern.cs:
+    	* UiaDbusSource/UiaDbusScrollItemPattern.cs:
+    	* UiaDbusSource/UiaDbusSelectionItemPattern.cs:
+    	* UiaDbusSource/UiaDbusExpandCollapsePattern.cs: Translate DBus Exceptions
+    
+    svn path=/trunk/uia2atk/; revision=145483
+
+ UIAutomation/ChangeLog                             |    6 ++
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    4 +
+ .../RangeValuePatternTest.cs                       |   85 ++++++++++++++++---
+ 3 files changed, 81 insertions(+), 14 deletions(-)
+
+commit 09de4ea07e10e0ca70596c3a640d24ab6a5dd606
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Tue Nov 3 20:26:58 2009 +0000
+
+    * TextSource.cs, ValueSource.cs, Element.cs, Makefile.am:
+    dd Text and Value patterns.
+    
+    * UIAutomationClientTests/TextPatternTest.cs,
+    AtspiUiaClientTests/TextPatternTest.cs, AtspiUiaClientTests/Makefile.am:
+    Add at-spi Text and Value tests.
+    
+    svn path=/trunk/uia2atk/; revision=145320
+
+ .../AtspiUiaClientTests/Makefile.am                |    1 +
+ .../AtspiUiaClientTests/TextPatternTest.cs         |   49 ++++++++++++++++++++
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    6 ++
+ .../UIAutomationClientTests/TextPatternTest.cs     |    8 ++-
+ 4 files changed, 62 insertions(+), 2 deletions(-)
+
+commit 04eb08e450f61d0273070aa8b778a48dc5ba4c23
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Oct 28 21:21:58 2009 +0000
+
+    * DataItemElement.cs, Element.cs, TableCellElement.cs, TableElement.cs,
+    TableHeaderElement.cs, TreeItemElement.cs, Makefile.am:
+    Translate Atk table hierarchies into a form expected for UIA.
+    
+    * AtspiUiaClientTests/TableHierarchyTest.cs,
+    AtspiUiaClientTests/Makefile.am,
+    UIAutomationClientTests/TableHierarchyTest.cs,
+    UIAutomationClientTests/Makefile.am: Add table hierarchy test.
+    
+    * UIAutomationClientTests/BaseTest.cs, GtkForm/GtkForm.cs: Add
+    DataGrid and RunCommand into Atspi client tests.
+    
+    * SampleForm/Form1.cs: Add some nodes to the TreeView.
+    
+    svn path=/trunk/uia2atk/; revision=144971
+
+ .../AtspiUiaClientTests/Makefile.am                |    1 +
+ .../AtspiUiaClientTests/TableHierarchyTest.cs      |   49 +++++++
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   11 ++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |   60 +++++++-
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    4 +
+ .../UIAutomationClientTests/BaseTest.cs            |   15 ++-
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests/TableHierarchyTest.cs  |  141 ++++++++++++++++++++
+ 8 files changed, 270 insertions(+), 12 deletions(-)
+
+commit dd7e0f3c247e2ad4dc837934a386f7e0529fa300
+Merge: d99f07a 1cb3d1c
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Oct 22 10:37:09 2009 +0000
+
+    In UIAutomation/:
+            * UIAutomationClientTests/SampleForm/Form1.cs:
+            * UIAutomationClientTests/SampleForm/Form1.Designer.cs:
+            * UIAutomationClient/System.Windows.Automation/GridPattern.cs:
+            * UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs:
+            * UIAutomationClientTests/UIAutomationClientTests/Makefile.am:
+            * UIAutomationClientTests/UIAutomationClientTests/TableTest.cs:
+            * UIAutomationSource/Mono.UIAutomation.Source/ITablePattern.cs:
+            * UIAutomationSource/Mono.UIAutomation.Source/ITableItemPattern.cs:
+            * UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj: Implementation/Tests for [Grid|GridItem|Table|TableItem]Pattern
+    
+    In UiaDbus/:
+            * UiaDbus/Makefile.am:
+            * UiaDbus/UiaDbus.mdp:
+            * UiaDbus/Constants.cs:
+            * UiaDbusBridge/Makefile.am:
+            * UiaDbusSource/Makefile.am:
+            * UiaDbusBridge/UiaDbusBridge.mdp:
+            * UiaDbusSource/UiaDbusElement.cs:
+            * UiaDbusSource/UiaDbusSource.mdp:
+            * UiaDbusBridge/AutomationBridge.cs:
+            * UiaDbus/Interfaces/IGridPattern.cs:
+            * UiaDbus/Interfaces/ITablePattern.cs:
+            * UiaDbusSource/UiaDbusGridPattern.cs:
+            * UiaDbusSource/UiaDbusTablePattern.cs:
+            * UiaDbus/Interfaces/IGridItemPattern.cs:
+            * UiaDbus/Interfaces/ITableItemPattern.cs:
+            * UiaDbusSource/UiaDbusGridItemPattern.cs:
+            * UiaDbus/Interfaces/InterfaceConverter.cs:
+            * UiaDbusSource/UiaDbusAutomationSource.cs:
+            * UiaDbusSource/UiaDbusTableItemPattern.cs:
+            * UiaDbusBridge/Wrappers/GridPatternWrapper.cs:
+            * UiaDbusBridge/Wrappers/TablePatternWrapper.cs:
+            * UiaDbusBridge/Wrappers/GridItemPatternWrapper.cs:
+            * UiaDbusBridge/Wrappers/ProviderElementWrapper.cs:
+            * UiaDbusBridge/Wrappers/TableItemPatternWrapper.cs:
+            Implement [Grid|GridItem|Table|TableItem]Pattern
+    
+    svn path=/trunk/uia2atk/; revision=144623
+
+commit 5382dbeeba93c93f164838c845ea342b2882d80a
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Tue Oct 13 20:21:36 2009 +0000
+
+    In UIAutomation/UIAutomationClient/:
+    	* System.Windows.Automation/TransformPattern.cs: Fix
+    	signature of Resize method.
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* SampleForm/Form1.cs:
+    	* UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClientTests/AutomationTest.cs:
+    	* UIAutomationClientTests/TransformPatternTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	Add TransformPattern tests, move some property verification
+    	tests from AutomationTest to TransformPatternTest.
+    
+    In UiaDbus/:
+    	* UiaDbus/Makefile.am:
+    	* UiaDbus/UiaDbus.mdp:
+    	* UiaDbusBridge/Makefile.am:
+    	* UiaDbusSource/Makefile.am:
+    	* UiaDbusBridge/UiaDbusBridge.mdp:
+    	* UiaDbusSource/UiaDbusElement.cs:
+    	* UiaDbusSource/UiaDbusSource.mdp:
+    	* UiaDbus/Interfaces/ITransformPattern.cs:
+    	* UiaDbusSource/UiaDbusTransformPattern.cs:
+    	* UiaDbusBridge/Wrappers/ProviderElementWrapper.cs:
+    	* UiaDbusBridge/Wrappers/TransformPatternWrapper.cs:
+    	Implement TransformPattern.
+    
+    svn path=/trunk/uia2atk/; revision=144047
+
+ UIAutomation/UIAutomationClient/ChangeLog          |    6 +
+ .../System.Windows.Automation/TransformPattern.cs  |    2 +-
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   11 +
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   14 +-
+ .../UIAutomationClientTests/AutomationTest.cs      |   12 -
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../TransformPatternTest.cs                        |  281 ++++++++++++++++++++
+ .../UIAutomationClientTests.csproj                 |    1 +
+ .../Mono.UIAutomation.Source/ITransformPattern.cs  |    2 +-
+ 9 files changed, 315 insertions(+), 15 deletions(-)
+
+commit a71dccbf70855df7ec8dff0a0c342d0e5d40c0c8
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Mon Oct 12 08:21:58 2009 +0000
+
+    Minor Fix, Add a sleep after one test step
+    
+    svn path=/trunk/uia2atk/; revision=143944
+
+ .../UIAutomationClientTests/ValuePatternTest.cs    |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+commit 407576c645451d23a692fb1f3dbad91e887f284f
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Mon Oct 12 06:10:06 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClient/System.Windows.Automation/Automation.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/TextPatternTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/ValuePatternTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/InvokePatternTest.cs: Fix the signature of AddPropertyChangedEventHandler, and refine the event tests.
+    
+    svn path=/trunk/uia2atk/; revision=143936
+
+ UIAutomation/ChangeLog                             |    6 +++
+ .../System.Windows.Automation/Automation.cs        |    2 +-
+ .../UIAutomationClientTests/InvokePatternTest.cs   |    3 +-
+ .../UIAutomationClientTests/TextPatternTest.cs     |    6 +--
+ .../UIAutomationClientTests/ValuePatternTest.cs    |   33 ++++++++++++-------
+ 5 files changed, 31 insertions(+), 19 deletions(-)
+
+commit 01eeda4f68539b2f8a18eb432829d48afeeab608
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Fri Oct 9 05:17:43 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomation/UIAutomationClientTests/UIAutomationClientTests/swfclienttest.sh.in:
+    	* UIAutomation/UIAutomationClientTests/AtspiUiaClientTests/atspiuiaclienttest.sh.in: Add fixture option to atspi test script, and correct the scripts' help messages.
+    
+    svn path=/trunk/uia2atk/; revision=143821
+
+ UIAutomation/ChangeLog                             |    6 ++++++
+ .../AtspiUiaClientTests/atspiuiaclienttest.sh.in   |   16 ++++++++++++----
+ .../UIAutomationClientTests/swfclienttest.sh.in    |    2 +-
+ 3 files changed, 19 insertions(+), 5 deletions(-)
+
+commit 23b489456697bf3c07757a10db440bfbf559a71d
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Oct 8 18:21:31 2009 +0000
+
+    changelog
+    
+    svn path=/trunk/uia2atk/; revision=143798
+
+ UIAutomation/ChangeLog |   21 +++++++++++++++++++++
+ 1 files changed, 21 insertions(+), 0 deletions(-)
+
+commit 82eb5d75825a8897e4ea9102cb3f21f25016ee99
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Oct 8 18:21:05 2009 +0000
+
+    In UIAutomation:
+            * UIAutomationClient/System.Windows.Automation/DockPattern.cs:
+            * UIAutomationClient/System.Windows.Automation/GridPattern.cs:
+            * UIAutomationClient/System.Windows.Automation/TablePattern.cs:
+            * UIAutomationClient/System.Windows.Automation/ValuePattern.cs:
+            * UIAutomationClient/System.Windows.Automation/InvokePattern.cs:
+            * UIAutomationClient/System.Windows.Automation/ScrollPattern.cs:
+            * UIAutomationClient/System.Windows.Automation/TogglePattern.cs:
+            * UIAutomationClient/System.Windows.Automation/WindowPattern.cs:
+            * UIAutomationClient/System.Windows.Automation/GridItemPattern.cs:
+            * UIAutomationClient/System.Windows.Automation/SelectionPattern.cs:
+            * UIAutomationClient/System.Windows.Automation/TableItemPattern.cs:
+            * UIAutomationClient/System.Windows.Automation/TransformPattern.cs:
+            * UIAutomationClient/System.Windows.Automation/RangeValuePattern.cs:
+            * UIAutomationClient/System.Windows.Automation/ScrollItemPattern.cs:
+            * UIAutomationClientTests/UIAutomationClientTests/AutomationTest.cs:
+            * UIAutomationClient/System.Windows.Automation/MultipleViewPattern.cs:
+            * UIAutomationClient/System.Windows.Automation/SelectionItemPattern.cs:
+            * UIAutomationClient/System.Windows.Automation/ExpandCollapsePattern.cs: Modify formats to follow the coding standard.
+    
+    svn path=/trunk/uia2atk/; revision=143797
+
+ .../System.Windows.Automation/DockPattern.cs       |    8 ++--
+ .../ExpandCollapsePattern.cs                       |    8 ++--
+ .../System.Windows.Automation/GridItemPattern.cs   |   24 ++++++------
+ .../System.Windows.Automation/GridPattern.cs       |   12 +++---
+ .../System.Windows.Automation/InvokePattern.cs     |    8 ++--
+ .../MultipleViewPattern.cs                         |   12 +++---
+ .../System.Windows.Automation/RangeValuePattern.cs |   28 ++++++++--------
+ .../System.Windows.Automation/ScrollItemPattern.cs |    4 +-
+ .../System.Windows.Automation/ScrollPattern.cs     |   28 ++++++++--------
+ .../SelectionItemPattern.cs                        |   24 ++++++------
+ .../System.Windows.Automation/SelectionPattern.cs  |   20 +++++-----
+ .../System.Windows.Automation/TableItemPattern.cs  |   12 +++---
+ .../System.Windows.Automation/TablePattern.cs      |   16 ++++----
+ .../System.Windows.Automation/TogglePattern.cs     |    8 ++--
+ .../System.Windows.Automation/TransformPattern.cs  |   16 ++++----
+ .../System.Windows.Automation/ValuePattern.cs      |   12 +++---
+ .../System.Windows.Automation/WindowPattern.cs     |   36 ++++++++++----------
+ .../UIAutomationClientTests/AutomationTest.cs      |    4 +-
+ 18 files changed, 140 insertions(+), 140 deletions(-)
+
+commit 8ae3ef9cf2e01cf388fa707ecd95831658a79953
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Oct 8 17:07:26 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClient/System.Windows.Automation/DockPattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/GridPattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/TablePattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/ScrollPattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/TogglePattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/WindowPattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/GridItemPattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/SelectionPattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/TableItemPattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/TransformPattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/RangeValuePattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/ScrollItemPattern.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/AutomationTest.cs:
+    	* UIAutomationClient/System.Windows.Automation/MultipleViewPattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/SelectionItemPattern.cs:
+    	* UIAutomationClient/System.Windows.Automation/ExpandCollapsePattern.cs: Initialize the static AutomationIdentifier fields in *Pattern classes.
+    
+    svn path=/trunk/uia2atk/; revision=143793
+
+ UIAutomation/ChangeLog                             |   19 ++
+ .../System.Windows.Automation/DockPattern.cs       |    6 +-
+ .../ExpandCollapsePattern.cs                       |    6 +-
+ .../System.Windows.Automation/GridItemPattern.cs   |   18 +-
+ .../System.Windows.Automation/GridPattern.cs       |    9 +-
+ .../MultipleViewPattern.cs                         |    9 +-
+ .../System.Windows.Automation/RangeValuePattern.cs |   21 +-
+ .../System.Windows.Automation/ScrollItemPattern.cs |    3 +-
+ .../System.Windows.Automation/ScrollPattern.cs     |   21 +-
+ .../SelectionItemPattern.cs                        |   18 +-
+ .../System.Windows.Automation/SelectionPattern.cs  |   15 +-
+ .../System.Windows.Automation/TableItemPattern.cs  |    9 +-
+ .../System.Windows.Automation/TablePattern.cs      |   12 +-
+ .../System.Windows.Automation/TogglePattern.cs     |    6 +-
+ .../System.Windows.Automation/TransformPattern.cs  |   12 +-
+ .../System.Windows.Automation/WindowPattern.cs     |   27 ++-
+ .../UIAutomationClientTests/AutomationTest.cs      |  316 ++++++++++++++++++++
+ 17 files changed, 463 insertions(+), 64 deletions(-)
+
+commit 21e9776f57ac2a831cd407674a2a571eb7d30c47
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Oct 8 16:57:23 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClientTests/SampleForm/Form1.cs:
+    	* UIAutomationClientTests/SampleForm/Form1.Designer.cs:
+    	* UIAutomationClient/System.Windows.Automation/TextPattern.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClientTests/UIAutomationClientTests/TextPatternTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/InvokePatternTest.cs:
+    	* UIAutomationClient/System.Windows.Automation.Text/TextPatternRange.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj: Implementing TextPattern
+    
+    In UiaDbus/:
+    	* UiaDbus/Makefile.am:
+    	* UiaDbus/UiaDbus.mdp:
+    	* UiaDbus/Constants.cs:
+    	* UiaDbusBridge/Makefile.am:
+    	* UiaDbusSource/Makefile.am:
+    	* UiaDbusBridge/UiaDbusBridge.mdp:
+    	* UiaDbusSource/UiaDbusElement.cs:
+    	* UiaDbusSource/UiaDbusSource.mdp:
+    	* UiaDbusBridge/AutomationBridge.cs:
+    	* UiaDbus/Interfaces/ITextPattern.cs:
+    	* UiaDbusSource/UiaDbusTextPattern.cs:
+    	* UiaDbus/Interfaces/ITextPatternRange.cs:
+    	* UiaDbusSource/UiaDbusTextPatternRange.cs:
+    	* UiaDbusBridge/Wrappers/TextPatternWrapper.cs:
+    	* UiaDbusBridge/Wrappers/ProviderElementWrapper.cs:
+    	* UiaDbusBridge/Wrappers/TextPatternRangeWrapper.cs: Implementing TextPattern
+    
+    svn path=/trunk/uia2atk/; revision=143792
+
+ UIAutomation/ChangeLog                             |   12 +
+ .../TextPatternRange.cs                            |    4 +
+ .../System.Windows.Automation/TextPattern.cs       |    6 +-
+ .../SampleForm/Form1.Designer.cs                   |   26 +-
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   25 +-
+ .../UIAutomationClientTests/BaseTest.cs            |   26 +-
+ .../UIAutomationClientTests/InvokePatternTest.cs   |   14 +-
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests/TextPatternTest.cs     |  740 ++++++++++++++++++++
+ .../UIAutomationClientTests.csproj                 |    3 +-
+ 10 files changed, 835 insertions(+), 22 deletions(-)
+
+commit ee4f384c23c51a417ddfb8f1fd57acc443b9134d
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Thu Sep 17 04:25:51 2009 +0000
+
+    Add Invoke, Grid, gridItem, table, and TableItem bindings for at-spi-sharp.
+    Add RangeValue, Selection, and ExpandCollapse tests.
+    
+    svn path=/trunk/uia2atk/; revision=142091
+
+ UIAutomation/UIAutomationClient/Makefile.am        |   13 ++-
+ .../System.Windows.Automation/TablePattern.cs      |    2 +-
+ .../AtspiUiaClientTests/InvokePatternTest.cs       |   49 +++++++++
+ .../AtspiUiaClientTests/Makefile.am                |    5 +-
+ .../AtspiUiaClientTests/TablePatternTest.cs        |  111 ++++++++++++++++++++
+ .../AtspiUiaClientTests/ValuePatternTest.cs        |   49 +++++++++
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   23 ++++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |   88 +++++++++++++++-
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   30 ++++++
+ .../UIAutomationClientTests/BaseTest.cs            |   50 +++++++++
+ .../ExpandCollapsePatternTest.cs                   |   81 ++++++++++++++
+ .../UIAutomationClientTests/InvokePatternTest.cs   |    2 +
+ .../UIAutomationClientTests/Makefile.am            |    3 +
+ .../RangeValuePatternTest.cs                       |   71 +++++++++++++
+ .../SelectionPatternTest.cs                        |   82 ++++++++++++++
+ .../UIAutomationClientTests.csproj                 |    3 +
+ UIAutomation/UIAutomationSource/ChangeLog          |    4 +
+ .../Mono.UIAutomation.Source/ITablePattern.cs      |    6 +-
+ UIAutomation/configure.ac                          |    4 +-
+ 19 files changed, 660 insertions(+), 16 deletions(-)
+
+commit 73618b56fee43567bdaf8229ff4f5e392f1f771a
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Sep 11 20:16:01 2009 +0000
+
+    In UIAutomation/:
+    	* Makefile.am:
+    	* configure.ac: If building with Mono >= 2.5, expect system-installed
+    	WindowsBase.  Only use bundled version for Mono < 2.5 (bug #538542).
+    	* expansions.m4: Borrow GAC assembly search macros from Banshee.
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* AtspiUiaClientTests/Makefile.am:
+    	* UIAutomationClientTests/Makefile.am: Use system-installed WindowsBase
+    	when using Mono >= 2.5 (bug #538542). Also, make sure to copy
+    	UIAutomationSource and UIAutomationProvider along with other UIA DLLs.
+    
+    svn path=/trunk/uia2atk/; revision=141791
+
+ UIAutomation/ChangeLog                             |    8 +++++
+ UIAutomation/Makefile.am                           |   11 +++++-
+ .../AtspiUiaClientTests/Makefile.am                |   31 ++++++++++++++++++
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    7 ++++
+ .../UIAutomationClientTests/Makefile.am            |   33 +++++++++++++++++++-
+ UIAutomation/configure.ac                          |    9 +++++
+ UIAutomation/expansions.m4                         |   26 +++++++++++++++
+ 7 files changed, 122 insertions(+), 3 deletions(-)
+
+commit 7f71df5f743531f19d12dc45adbd4a6be1e6fc0c
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Tue Sep 8 23:33:33 2009 +0000
+
+    2009-09-08  Sandy Armstrong  <sanfordarmstrong at gmail.com>
+    
+    	* SampleForm/Form1.Designer.cs: Add NumericUpDown.
+    
+    svn path=/trunk/uia2atk/; revision=141548
+
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    4 +
+ .../SampleForm/Form1.Designer.cs                   |   80 +++++++++++--------
+ 2 files changed, 50 insertions(+), 34 deletions(-)
+
+commit ffd35d78b85d68df7774db735e9a1b53f502487b
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Tue Sep 8 10:11:33 2009 +0000
+
+    * UIAutomation/UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs:
+    * UIAutomation/UIAutomationClient/System.Windows.Automation/AutomationElement.AutomationElementInformation.cs: fix 530418
+    
+    svn path=/trunk/uia2atk/; revision=141494
+
+ UIAutomation/ChangeLog                             |    7 ++
+ ...tomationElement.AutomationElementInformation.cs |   77 +++++++-------------
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    4 +
+ .../AutomationElementTest.cs                       |   20 +++++-
+ 4 files changed, 57 insertions(+), 51 deletions(-)
+
+commit 5f82a0a680a178e894b49aa2221024dfd25dde65
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Fri Sep 4 06:43:01 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomationClient/System.Windows.Automation/Automation.cs:
+    	* UIAutomationClient/System.Windows.Automation/SourceManager.cs:
+    	* UIAutomationSource/Mono.UIAutomation.Source/IAutomationSource.cs:
+    	Support for automation events.
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* UIAutomationClientTests/BaseTest.cs:
+    	* UIAutomationClientTests/Makefile.am:
+    	* UIAutomationClientTests/ValuePatternTest.cs:
+    	* UIAutomationClientTests/InvokePatternTest.cs:
+    	* UIAutomationClientTests/AutomationEventTest.cs:
+    	* UIAutomationClientTests/UIAutomationClientTests.csproj: Add event
+    	tests for sturcture changes and existing pattern TestFixtures.
+    
+    In UiaDbus/:
+    	* UiaDbusSource/Makefile.am:
+    	* UiaDbusBridge/Application.cs:
+    	* UiaDbusSource/UiaDbusSource.mdp:
+    	* UiaDbusBridge/AutomationBridge.cs:
+    	* UiaDbus/Interfaces/IApplication.cs:
+    	* UiaDbusSource/EventHandlerManager.cs:
+    	* UiaDbusSource/DbusExceptionTranslator.cs:
+    	* UiaDbusSource/UiaDbusAutomationSource.cs: Add support for automation
+    	events.
+    
+    svn path=/trunk/uia2atk/; revision=141293
+
+ UIAutomation/ChangeLog                             |    7 ++
+ UIAutomation/UIAutomationClient/AssemblyInfo.cs.in |    2 +
+ .../System.Windows.Automation/Automation.cs        |   53 +++++++++--
+ .../System.Windows.Automation/SourceManager.cs     |   32 ++++---
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   10 ++
+ .../UIAutomationClientTests/AutomationEventTest.cs |   98 ++++++++++++++++++++
+ .../UIAutomationClientTests/BaseTest.cs            |   17 +++-
+ .../UIAutomationClientTests/InvokePatternTest.cs   |   51 ++++++++++-
+ .../UIAutomationClientTests/Makefile.am            |    1 +
+ .../UIAutomationClientTests.csproj                 |    5 +-
+ .../UIAutomationClientTests/ValuePatternTest.cs    |   31 ++++++-
+ .../Mono.UIAutomation.Source/IAutomationSource.cs  |   26 +++++
+ 12 files changed, 302 insertions(+), 31 deletions(-)
+
+commit 68a192e06208f40be86e3e97d8fbee0d66eaef46
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Mon Aug 31 19:26:01 2009 +0000
+
+    In UIAutomation/UIAutomationClientTests/:
+    	* SampleForm/Form1.resx:
+    	* SampleForm/Form1.Designer.cs: Add TreeView to SampleForm, and
+    	rearrange some buttons added in the last commit to unbreak
+    	TreeWalker unit tests.
+    
+    svn path=/trunk/uia2atk/; revision=140985
+
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    7 +
+ .../SampleForm/Form1.Designer.cs                   |  464 ++++++++++----------
+ .../UIAutomationClientTests/SampleForm/Form1.resx  |  238 +++++-----
+ 3 files changed, 363 insertions(+), 346 deletions(-)
+
+commit e5cf98b81158eef8c33cb6a1b9e5aa8abe87240b
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Mon Aug 24 07:25:37 2009 +0000
+
+    Implemented ValuePattern,
+    And updated tests for InvokePattern and ValuePattern,
+    Also some minor bug fixes in UIAutomation are included.
+    
+    svn path=/trunk/uia2atk/; revision=140470
+
+ UIAutomation/UIAutomationClient/ChangeLog          |   10 +
+ .../System.Windows.Automation/AutomationElement.cs |    2 +-
+ .../System.Windows.Automation/InvokePattern.cs     |    6 +-
+ .../System.Windows.Automation/ValuePattern.cs      |    9 +-
+ UIAutomation/UIAutomationClientTests/ChangeLog     |   11 +
+ .../SampleForm/Form1.Designer.cs                   |  419 +++++++++++---------
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   33 ++-
+ .../UIAutomationClientTests/Makefile.am            |    3 +-
+ .../UIAutomationClientTests.csproj                 |    3 +-
+ .../UIAutomationClientTests/ValuePatternTest.cs    |   74 ++++
+ 10 files changed, 371 insertions(+), 199 deletions(-)
+
+commit d165ca7d7d9a075837a471f5c85a7a81018f1322
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Aug 21 14:47:11 2009 +0000
+
+    In UIAutomation/:
+    	* Makefile.am:
+    	* configure.ac: Move UIAutomationClient/Test to
+    	UIAutomationClientTests, enable in build.
+    
+    In UIAutomation/UIAutomationClient/:
+    	* Makefile.am: Test/ is now its own project directly under
+    	UIAutomation.
+    
+    In UIAutomation/UIAutomationClientTests/:
+    	* Makefile.am:
+    	* SampleForm/Makefile.am:
+    	* AtspiUiaClientTests/Makefile.am:
+    	* UIAutomationClientTests/Makefile.am: Add and update makefiles
+    	so that Client unit tests are included in build.
+    
+    svn path=/trunk/uia2atk/; revision=140418
+
+ UIAutomation/ChangeLog                             |    6 +
+ UIAutomation/Makefile.am                           |    7 +-
+ UIAutomation/UIAutomationClient/ChangeLog          |    5 +
+ UIAutomation/UIAutomationClient/Makefile.am        |    6 -
+ UIAutomation/UIAutomationClient/Test/Makefile.am   |    1 -
+ .../AtspiUiaClientTests/Makefile.am                |  105 --
+ .../AtspiUiaClientTests/TogglePatternTest.cs       |   49 -
+ .../AtspiUiaClientTests/atspiuiaclienttest.sh.in   |   55 -
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |   82 --
+ .../UIAutomationClientTests/GtkForm/Makefile.am    |   70 --
+ .../Test/UIAutomationClientTests/Makefile.am       |    1 -
+ .../SampleForm/Form1.Designer.cs                   |  239 -----
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   49 -
+ .../SampleForm/Form1.resources                     |  Bin 172 -> 0 bytes
+ .../UIAutomationClientTests/SampleForm/Form1.resx  |  120 ---
+ .../UIAutomationClientTests/SampleForm/Program.cs  |   19 -
+ .../SampleForm/Properties/AssemblyInfo.cs          |   36 -
+ .../SampleForm/Properties/Resources.Designer.cs    |   68 --
+ .../SampleForm/Properties/Resources.resources      |  Bin 172 -> 0 bytes
+ .../SampleForm/Properties/Resources.resx           |  117 ---
+ .../SampleForm/Properties/Settings.Designer.cs     |   28 -
+ .../SampleForm/Properties/Settings.settings        |    7 -
+ .../SampleForm/SampleForm.csproj                   |   83 --
+ .../UIAutomationClientTests.sln                    |   26 -
+ .../AutomationElementTest.cs                       | 1043 --------------------
+ .../UIAutomationClientTests/AutomationTest.cs      |  491 ---------
+ .../UIAutomationClientTests/BaseTest.cs            |  278 ------
+ .../UIAutomationClientTests/ConditionTest.cs       |  481 ---------
+ .../UIAutomationClientTests/InvokePatternTest.cs   |   65 --
+ .../Properties/AssemblyInfo.cs                     |   36 -
+ .../UIAutomationClientTests/TogglePatternTest.cs   |   68 --
+ .../UIAutomationClientTests/TreeWalkerTest.cs      |  328 ------
+ .../UIAutomationClientTests.csproj                 |   81 --
+ .../UIAutomationClientTests/swfclienttest.sh.in    |   61 --
+ .../AtspiUiaClientTests/Makefile.am                |  103 ++
+ .../AtspiUiaClientTests/TogglePatternTest.cs       |   49 +
+ .../AtspiUiaClientTests/atspiuiaclienttest.sh.in   |   55 +
+ UIAutomation/UIAutomationClientTests/ChangeLog     |    7 +
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |   82 ++
+ .../UIAutomationClientTests/GtkForm/Makefile.am    |   70 ++
+ UIAutomation/UIAutomationClientTests/Makefile.am   |    1 +
+ .../SampleForm/Form1.Designer.cs                   |  239 +++++
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   49 +
+ .../UIAutomationClientTests/SampleForm/Form1.resx  |  120 +++
+ .../UIAutomationClientTests/SampleForm/Makefile.am |   63 ++
+ .../UIAutomationClientTests/SampleForm/Program.cs  |   19 +
+ .../SampleForm/Properties/AssemblyInfo.cs          |   36 +
+ .../SampleForm/SampleForm.csproj                   |   85 ++
+ .../UIAutomationClientTests.sln                    |   26 +
+ .../AutomationElementTest.cs                       | 1043 ++++++++++++++++++++
+ .../UIAutomationClientTests/AutomationTest.cs      |  491 +++++++++
+ .../UIAutomationClientTests/BaseTest.cs            |  278 ++++++
+ .../UIAutomationClientTests/ConditionTest.cs       |  481 +++++++++
+ .../UIAutomationClientTests/InvokePatternTest.cs   |   65 ++
+ .../UIAutomationClientTests/Makefile.am            |  111 +++
+ .../Properties/AssemblyInfo.cs                     |   36 +
+ .../UIAutomationClientTests/TogglePatternTest.cs   |   68 ++
+ .../UIAutomationClientTests/TreeWalkerTest.cs      |  328 ++++++
+ .../UIAutomationClientTests.csproj                 |   96 ++
+ .../UIAutomationClientTests/swfclienttest.sh.in    |   61 ++
+ UIAutomation/configure.ac                          |   17 +-
+ 61 files changed, 4089 insertions(+), 4101 deletions(-)
+
+commit 25d06daaf716892a1b09e37ad152863db8e7a1b3
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Thu Aug 20 13:50:26 2009 +0000
+
+    In UIAutomation/UIAutomationClient/:
+    	* Makefile.am:
+    	* UIAutomationClient.mdp:
+    	* System.Windows.Automation/Automation.cs:
+    	* System.Windows.Automation/AutomationElement.cs:
+    	* System.Windows.Automation/AutomationElement.AutomationElementInformation.cs:
+    	Simplify AutomationElement comparison methods, and split
+    	AutomationElement.AutomationElementInformation out into its own file.
+    
+    svn path=/trunk/uia2atk/; revision=140338
+
+ UIAutomation/UIAutomationClient/ChangeLog          |   10 ++
+ UIAutomation/UIAutomationClient/Makefile.am        |    1 +
+ .../System.Windows.Automation/Automation.cs        |    3 +-
+ ...tomationElement.AutomationElementInformation.cs |  161 ++++++++++++++++++++
+ .../System.Windows.Automation/AutomationElement.cs |  141 +-----------------
+ .../UIAutomationClient/UIAutomationClient.mdp      |    1 +
+ 6 files changed, 177 insertions(+), 140 deletions(-)
+
+commit 8a19055853ce847c1ed13f9233c1e4f7ffc8e522
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Wed Aug 19 19:43:04 2009 +0000
+
+    In UIAutomation/UIAutomationClient/:
+    	* Makefile.am:
+    	* UIAutomationClient.mdp:
+    	* System.Windows.Automation/TreeWalker.cs:
+    	* System.Windows.Automation/TreeWalker.TreeIterator.cs:
+    	Complete most of TreeWalker (bug #513989). Break iteration
+    	implementation out into a private inner class called TreeIterator.
+    	* Test/UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs:
+    	* Test/UIAutomationClientTests/UIAutomationClientTests/TreeWalkerTest.cs:
+    	Thorough tests of TreeWalker behavior.
+    	* Test/UIAutomationClientTests/UIAutomationClientTests/swfclienttest.sh.in:
+    	Client test runner script.
+    
+    In UiaDbus/:
+    	* UiaDbusBridge/Wrappers/ProviderElementWrapper.cs:
+    	Never return self as parent element.
+    
+    svn path=/trunk/uia2atk/; revision=140277
+
+ UIAutomation/UIAutomationClient/ChangeLog          |   16 +
+ UIAutomation/UIAutomationClient/Makefile.am        |    1 +
+ .../TreeWalker.TreeIterator.cs                     |  314 ++++++++++++++++++++
+ .../System.Windows.Automation/TreeWalker.cs        |   68 ++---
+ .../UIAutomationClientTests/BaseTest.cs            |   15 +-
+ .../UIAutomationClientTests/TreeWalkerTest.cs      |  120 ++++++++-
+ .../UIAutomationClientTests/swfclienttest.sh.in    |   61 ++++
+ .../UIAutomationClient/UIAutomationClient.mdp      |    1 +
+ 8 files changed, 553 insertions(+), 43 deletions(-)
+
+commit 62cb210f0ad6a81e92e237d946e362441ac5f50b
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Mon Aug 17 23:12:45 2009 +0000
+
+    In UIAutomation/UIAutomationBridge/:
+    	* Mono.UIAutomation.Services/Log.cs: Fix typo in LogLevel check.
+    
+    svn path=/trunk/uia2atk/; revision=140114
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    4 ++++
+ .../Mono.UIAutomation.Services/Log.cs              |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletions(-)
+
+commit 104073562ac2bbbfd2e315813ea8e06f3cc1c1fe
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Thu Aug 13 02:23:52 2009 +0000
+
+    Fix bug #489370, Implement InvokePattern for DbusCore.
+    
+    svn path=/trunk/uia2atk/; revision=139830
+
+ UIAutomation/UIAutomationClient/ChangeLog          |   12 ++++
+ .../System.Windows.Automation/AutomationElement.cs |    2 +-
+ .../System.Windows.Automation/InvokePattern.cs     |    6 +-
+ .../SampleForm/Form1.Designer.cs                   |    1 +
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    7 ++
+ .../UIAutomationClientTests/InvokePatternTest.cs   |   65 ++++++++++++++++++++
+ .../UIAutomationClientTests.csproj                 |    3 +-
+ UIAutomation/UIAutomationSource/ChangeLog          |    5 ++
+ UIAutomation/UIAutomationSource/Makefile.am        |    1 +
+ .../Mono.UIAutomation.Source/IInvokePattern.cs     |   34 ++++++++++
+ 10 files changed, 131 insertions(+), 5 deletions(-)
+
+commit c6d76cf13ca34ae60ac2e19bc8fe693ac1a9be03
+Author: Neville Gao <ngao at mono-cvs.ximian.com>
+Date:   Wed Aug 12 09:21:03 2009 +0000
+
+    Modified StructureChangedEvetintArgs.EventId.
+    
+    svn path=/trunk/uia2atk/; revision=139752
+
+ UIAutomation/UIAutomationTypes/ChangeLog           |    7 +++
+ .../StructureChangedEventArgs.cs                   |    2 +-
+ UIAutomation/UIAutomationTypes/Test/ChangeLog      |    5 ++
+ .../StructureChangedEventArgsTest.cs               |   46 ++++++++++++++++++++
+ .../UIAutomationTypes/UIAutomationTypesTests.mdp   |    1 +
+ 5 files changed, 60 insertions(+), 1 deletions(-)
+
+commit 4ad9a631f7bd73ce6304349ade710bf56c8b9250
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Wed Aug 5 20:37:26 2009 +0000
+
+    Reverting r139385 because it causes the build to break, and because it did not go through a proper peer code review.
+    
+    
+    svn path=/trunk/uia2atk/; revision=139443
+
+ UIAutomation/ChangeLog                             |    5 -----
+ .../System.Windows.Automation/AutomationElement.cs |    2 +-
+ .../System.Windows.Automation/InvokePattern.cs     |    6 +++---
+ .../SampleForm/Form1.Designer.cs                   |    1 -
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    7 -------
+ .../UIAutomationClientTests.csproj                 |    1 -
+ UIAutomation/UIAutomationSource/Makefile.am        |    1 -
+ .../UIAutomationSource/UIAutomationSource.mdp      |   15 ---------------
+ 8 files changed, 4 insertions(+), 34 deletions(-)
+
+commit ade6404048d79d430a2bffa323c2c4a6681bb2b0
+Author: Matt Guo <rguo at mono-cvs.ximian.com>
+Date:   Wed Aug 5 03:38:48 2009 +0000
+
+    * Add client test for InvokePattern
+    * Change the type of InvokePattern.source from IInvokeProvider to IInvokePattern
+    
+    
+    svn path=/trunk/uia2atk/; revision=139385
+
+ UIAutomation/ChangeLog                             |    5 +++++
+ .../System.Windows.Automation/AutomationElement.cs |    2 +-
+ .../System.Windows.Automation/InvokePattern.cs     |    6 +++---
+ .../SampleForm/Form1.Designer.cs                   |    1 +
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |    7 +++++++
+ .../UIAutomationClientTests.csproj                 |    1 +
+ UIAutomation/UIAutomationSource/Makefile.am        |    1 +
+ .../UIAutomationSource/UIAutomationSource.mdp      |   15 +++++++++++++++
+ 8 files changed, 34 insertions(+), 4 deletions(-)
+
+commit d3797e4a5b95add386d05872a9497a8e0aa7dda8
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Wed Jul 29 20:37:08 2009 +0000
+
+    In /:
+    	* Uia2Atk.mds:
+    	* UiaDbus/:
+    	* UiaDbusCoreBridge/:
+    	* DbusCoreUiaSource/: Merge UiaDbusCoreBridge and DbusCoreUiaSource
+    	into a single project: UiaDbus.
+    
+    In UIAutomation/UIAutomationClient/:
+    	* System.Windows.Automation/SourceManager.cs:
+    	DbusCoreUiaSource -> UiaDbusSource.
+    
+    In UIAutomation/UIAutomationProvider/:
+    	* System.Windows.Automation.Provider/AutomationInteropProvider.cs:
+    	UiaDbusCoreBridge->UiaDbusBridge.
+    
+    In UiaDbus/:
+    	* *: Rename DbusCore->UiaDbus, UiaDbusCoreBridge*->UiaDbusBridge*,
+    	and DbusCoreUiaSource->UiaDbusSource. Update tarball names,
+    	.pc files, file names, namespaces, etc.
+    
+    svn path=/trunk/uia2atk/; revision=138997
+
+ UIAutomation/UIAutomationClient/ChangeLog          |    5 +++++
+ .../System.Windows.Automation/SourceManager.cs     |    6 +++---
+ UIAutomation/UIAutomationProvider/ChangeLog        |    5 +++++
+ .../AutomationInteropProvider.cs                   |    6 +++---
+ 4 files changed, 16 insertions(+), 6 deletions(-)
+
+commit e0eedaac205e9dee55651418b56f8d30da4abefa
+Author: Andrés G. Aragoneses <knocte at gmail.com>
+Date:   Wed Jul 15 15:57:52 2009 +0000
+
+    * UiaAtkBridge/Test/UiaAtkBridgeTest/BridgeTester.cs:
+    * UIAutomationWinforms/UIAutomationWinformsTests/TestHelper.cs: Hook
+      on Log.Error events.
+    
+    * UIAutomation/UIAutomationBridge/Mono.UIAutomation.Services/Log.cs:
+      New ErrorHappened event for unit tests.
+    
+    Fixes bug #485268.
+    
+    svn path=/trunk/uia2atk/; revision=137970
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    5 +++
+ .../Mono.UIAutomation.Services/Log.cs              |   30 ++++++++++++--------
+ 2 files changed, 23 insertions(+), 12 deletions(-)
+
+commit 21ef3ba4931a4db1d95d8f2721de1c3354d3690d
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Jul 1 13:49:54 2009 +0000
+
+    Added pattern infrastructure.
+    
+    svn path=/trunk/uia2atk/; revision=137194
+
+ UIAutomation/UIAutomationClient/ChangeLog          |   36 +++
+ UIAutomation/UIAutomationClient/Makefile.am        |    6 +
+ .../TextPatternRange.cs                            |  106 ++++---
+ .../System.Windows.Automation/AutomationElement.cs |  311 +++++++++++---------
+ .../System.Windows.Automation/DesktopElement.cs    |   11 +
+ .../System.Windows.Automation/DockPattern.cs       |   20 +-
+ .../ExpandCollapsePattern.cs                       |   22 +-
+ .../System.Windows.Automation/GridItemPattern.cs   |   38 ++-
+ .../System.Windows.Automation/GridPattern.cs       |   24 +-
+ .../System.Windows.Automation/InvokePattern.cs     |    9 +-
+ .../MultipleViewPattern.cs                         |   27 ++-
+ .../System.Windows.Automation/RangeValuePattern.cs |   45 ++--
+ .../System.Windows.Automation/ScrollItemPattern.cs |    9 +-
+ .../System.Windows.Automation/ScrollPattern.cs     |   51 ++--
+ .../SelectionItemPattern.cs                        |   29 ++-
+ .../System.Windows.Automation/SelectionPattern.cs  |   30 ++-
+ .../System.Windows.Automation/SourceManager.cs     |    8 +
+ .../System.Windows.Automation/TableItemPattern.cs  |   47 ++--
+ .../System.Windows.Automation/TablePattern.cs      |   37 ++-
+ .../System.Windows.Automation/TextPattern.cs       |   34 ++-
+ .../System.Windows.Automation/TogglePattern.cs     |   20 +-
+ .../System.Windows.Automation/TransformPattern.cs  |   34 ++-
+ .../System.Windows.Automation/ValuePattern.cs      |   25 +-
+ .../System.Windows.Automation/WindowPattern.cs     |   49 ++--
+ UIAutomation/UIAutomationClient/Test/Makefile.am   |    1 +
+ .../AtspiUiaClientTests/Makefile.am                |  105 +++++++
+ .../AtspiUiaClientTests/TogglePatternTest.cs       |   49 +++
+ .../AtspiUiaClientTests/atspiuiaclienttest.sh.in   |   55 ++++
+ .../UIAutomationClientTests/GtkForm/GtkForm.cs     |   82 +++++
+ .../UIAutomationClientTests/GtkForm/Makefile.am    |   70 +++++
+ .../Test/UIAutomationClientTests/Makefile.am       |    1 +
+ .../AutomationElementTest.cs                       |  304 +++++++++++++++++++
+ .../UIAutomationClientTests/BaseTest.cs            |  139 ++++++++-
+ .../UIAutomationClientTests/TogglePatternTest.cs   |   68 +++++
+ .../UIAutomationClientTests.csproj                 |    3 +-
+ UIAutomation/UIAutomationSource/Makefile.am        |   16 +-
+ .../Mono.UIAutomation.Source/IElement.cs           |    4 +
+ .../Mono.UIAutomation.Source/IGridItemPattern.cs   |   44 +++
+ .../Mono.UIAutomation.Source/IGridPattern.cs       |   43 +++
+ .../IMultipleViewPattern.cs                        |   44 +++
+ .../Mono.UIAutomation.Source/IRangeValuePattern.cs |   47 +++
+ .../Mono.UIAutomation.Source/IScrollPattern.cs     |   49 +++
+ .../ISelectionItemPattern.cs                       |   47 +++
+ .../Mono.UIAutomation.Source/ISelectionPattern.cs  |   42 +++
+ .../Mono.UIAutomation.Source/ITableItemPattern.cs  |   46 +++
+ .../Mono.UIAutomation.Source/ITablePattern.cs      |   47 +++
+ .../Mono.UIAutomation.Source/ITextPattern.cs       |   43 +++
+ .../Mono.UIAutomation.Source/ITextPatternRange.cs  |   55 ++++
+ .../Mono.UIAutomation.Source/ITransformPattern.cs  |   48 +++
+ .../Mono.UIAutomation.Source/IValuePattern.cs      |   43 +++
+ .../Mono.UIAutomation.Source/IWindowPattern.cs     |   52 ++++
+ UIAutomation/configure.ac                          |   39 ++-
+ 52 files changed, 2205 insertions(+), 409 deletions(-)
+
+commit c0103738ee8ae77de263ba7cb0023027ef368f42
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Wed Jun 24 21:40:54 2009 +0000
+
+    In UIAutomation/UIAutomationClient/:
+    	* Test/UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs:
+    	Add Ignore'd CultureTest as a reminder for the future.
+    
+    svn path=/trunk/uia2atk/; revision=136791
+
+ UIAutomation/UIAutomationClient/ChangeLog          |    5 +++++
+ .../AutomationElementTest.cs                       |   10 ++++++++++
+ 2 files changed, 15 insertions(+), 0 deletions(-)
+
+commit 6c08a4936245ccc7291290a09f1652958a53b0a4
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Wed Jun 24 21:35:20 2009 +0000
+
+    In UIAutomation/:
+    	* WindowsBase/System.Windows/Rect.cs: Add missing using statement.
+    
+    svn path=/trunk/uia2atk/; revision=136789
+
+ UIAutomation/ChangeLog                          |    4 ++++
+ UIAutomation/WindowsBase/System.Windows/Rect.cs |    1 +
+ 2 files changed, 5 insertions(+), 0 deletions(-)
+
+commit 3d819638fef2872f65f6278cab3ecf5ab991f160
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Wed Jun 24 21:29:46 2009 +0000
+
+    In UIAutomation/:
+    	* WindowsBase/System.Windows/Rect.cs: Implement ToString methods
+    	(proposed fix for bug #516165).
+    
+    In UIAutomation/UIAutomationClient/:
+    	* Makefile.am:
+    	* UIAutomationClient.mdp:
+    	* System.Windows.Automation/InternalCondition.cs -> System.Windows.Automation/BoolCondition.cs:
+    	Rename InternalCondition to the more-specific internal BoolCondition.
+    	* Test/UIAutomationClientTests/UIAutomationClientTests/ConditionTest.cs:
+    	Updated unit tests to thoroughly cover PropertyCondition behavior.
+    	* System.Windows.Automation/Condition.cs:
+    	* System.Windows.Automation/Automation.cs:
+    	* System.Windows.Automation/OrCondition.cs:
+    	* System.Windows.Automation/AndCondition.cs:
+    	* System.Windows.Automation/NotCondition.cs:
+    	* System.Windows.Automation/PropertyConditon.cs:
+    	* System.Windows.Automation/AutomationElement.cs: Update PropertyCondition
+    	implementation to match unit tests.  Refactor Element/Condition matching
+    	to work via new virtual Condition.AppliesTo method, instead of old
+    	AutomationElement.ElementMeetsCondition method.
+    
+    svn path=/trunk/uia2atk/; revision=136788
+
+ UIAutomation/ChangeLog                             |    5 +
+ UIAutomation/UIAutomationClient/ChangeLog          |   21 +
+ UIAutomation/UIAutomationClient/Makefile.am        |    2 +-
+ .../System.Windows.Automation/AndCondition.cs      |    8 +
+ .../System.Windows.Automation/Automation.cs        |    2 +-
+ .../System.Windows.Automation/AutomationElement.cs |   66 +---
+ .../System.Windows.Automation/BoolCondition.cs     |   44 ++
+ .../System.Windows.Automation/Condition.cs         |    8 +-
+ .../System.Windows.Automation/InternalCondition.cs |   33 --
+ .../System.Windows.Automation/NotCondition.cs      |    5 +
+ .../System.Windows.Automation/OrCondition.cs       |    8 +
+ .../System.Windows.Automation/PropertyConditon.cs  |  305 ++++++++++++++-
+ .../UIAutomationClientTests/ConditionTest.cs       |  427 +++++++++++++++++++-
+ .../UIAutomationClient/UIAutomationClient.mdp      |    2 +-
+ UIAutomation/WindowsBase/System.Windows/Rect.cs    |   35 ++-
+ 15 files changed, 847 insertions(+), 124 deletions(-)
+
+commit f462530099428a0c5353fba34e4cb647490b956b
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Wed Jun 17 19:35:05 2009 +0000
+
+    * Test/UIAutomationClientTests/SampleForm/Form1.resx:
+    * Test/UIAutomationClientTests/SampleForm/Form1.cs:
+    * Test/UIAutomationClientTests/SampleForm/Form1.Designer.cs:
+    Add more layers to control hierarchy for TreeWalkerTest.
+    
+    * Test/UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs:
+    * Test/UIAutomationClientTests/UIAutomationClientTests/AutomationTest.cs:
+    * Test/UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs:
+    Factor common code dealing with SampleForm into BaseTest.  Also, use
+    String instead of string when accessing static String members.
+    
+    * Test/UIAutomationClientTests/UIAutomationClientTests/TreeWalkerTest.cs:
+    New unit test of TreeWalker support for Conditions.
+    
+    * Test/UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj:
+    Add new files
+    
+    svn path=/trunk/uia2atk/; revision=136348
+
+ UIAutomation/UIAutomationClient/ChangeLog          |   19 ++
+ .../SampleForm/Form1.Designer.cs                   |  107 ++++++++-
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   84 ++++----
+ .../UIAutomationClientTests/SampleForm/Form1.resx  |  238 ++++++++++----------
+ .../AutomationElementTest.cs                       |  143 ++----------
+ .../UIAutomationClientTests/AutomationTest.cs      |   15 +-
+ .../UIAutomationClientTests/BaseTest.cs            |  160 +++++++++++++
+ .../UIAutomationClientTests/TreeWalkerTest.cs      |  210 +++++++++++++++++
+ .../UIAutomationClientTests.csproj                 |    4 +-
+ 9 files changed, 677 insertions(+), 303 deletions(-)
+
+commit 7bf0ffb7ba07c10ffa02bafe6fc53d7ee8eea59e
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Mon Jun 15 16:24:35 2009 +0000
+
+    In /:
+    	* Uia2Atk.mds: Add DbusCoreUiaSource to solution.
+    
+    In DbusCoreUiaSource/:
+    	* NEWS:
+    	* README:
+    	* COPYING:
+    	* ChangeLog:
+    	* autogen.sh:
+    	* Makefile.am:
+    	* configure.ac:
+    	* mono-uia.snk:
+    	* expansions.m4:
+    	* Makefile.include:
+    	* DbusCoreUiaSource.mds:
+    	* DbusCoreUiaSource/ChangeLog:
+    	* DbusCoreUiaSource/Makefile.am:
+    	* DbusCoreUiaSource/AssemblyInfo.cs:
+    	* DbusCoreUiaSource/DbusCoreUiaSource.mdp: Infrastructure for new
+    	DbusCoreUiaSource assembly.
+    
+    	* DbusCoreUiaSource/DbusCoreElement.cs:
+    	* DbusCoreUiaSource/DbusCoreAutomationSource.cs: Implementation of
+    	UIAutomationSource interfaces for automation elements exposed over the
+    	UiaDbusCoreBridge.
+    
+    In UIAutomation/UIAutomationClient/:
+    	* System.Windows.Automation/TreeWalker.cs: Fix typo which broke
+    	use of all TreeWalkers expect RawViewWalker.
+    
+    svn path=/trunk/uia2atk/; revision=136140
+
+ UIAutomation/UIAutomationClient/ChangeLog          |    5 +++++
+ .../System.Windows.Automation/TreeWalker.cs        |    4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit ce2552077b240c0a55695421bd91a73ce14e5510
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Thu Jun 11 02:07:22 2009 +0000
+
+    In UIAutomation/UIAutomationClient/:
+    	* System.Windows.Automation/Condition.cs: Implement TrueCondition and
+    	FalseCondition.
+    
+    	* Test/UIAutomationClientTests/UIAutomationClientTests/ConditionTest.cs:
+    	* Test/UIAutomationClientTests/UIAutomationClientTests/UIAutomationClientTests.csproj:
+    	Unit tests for TrueCondition and FalseCondition.
+    
+    	* Test/UIAutomationClientTests/SampleForm/Form1.cs:
+    	* Test/UIAutomationClientTests/UIAutomationClientTests/AutomationTest.cs:
+    	* Test/UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs:
+    	Add missing headers, fix some typos.
+    
+    svn path=/trunk/uia2atk/; revision=135907
+
+ UIAutomation/UIAutomationClient/ChangeLog          |   14 ++++
+ .../System.Windows.Automation/Condition.cs         |    6 +-
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   25 ++++++
+ .../AutomationElementTest.cs                       |   25 ++++++
+ .../UIAutomationClientTests/AutomationTest.cs      |   29 +++++++-
+ .../UIAutomationClientTests/ConditionTest.cs       |   78 ++++++++++++++++++++
+ .../UIAutomationClientTests.csproj                 |    1 +
+ 7 files changed, 174 insertions(+), 4 deletions(-)
+
+commit 588f9981701903eb5d105fd2e6c826b364e589bf
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Wed Jun 10 22:30:24 2009 +0000
+
+    In UIAutomation/:
+    	* UIAutomation.mds:  Add UIAutomationClient to solution.
+    
+    In UIAutomation/UIAutomationClient/:
+    	* Makefile.am:
+    	* AssemblyInfo.cs.in:
+    	* UIAutomationClient.mdp:
+    	* UIAutomationClient.mds: Add new files and a MonoDevelop solution.
+    	* System.Windows.Automation/*Condition.cs: Implement Condition
+    	classes, including one for internal uses.
+    	* System.Windows.Automation/Automation.cs: Implement (bug #489325).
+    	* System.Windows.Automation/TreeWalker.cs:
+    	* System.Windows.Automation/SourceManager.cs: Implement TreeWalker class,
+    	and SourceManager which aids in loading AutomationSources and their
+    	AutomationElements into the automation tree (bug #489321 and bug #489323).
+    
+    	* System.Windows.Automation/DesktopElement.cs:
+    	* System.Windows.Automation/AutomationElement.cs: Implment AutomationElement
+    	class as a wrapper around the UIAutomationSource.IElement interface, and a
+    	special DesktopElement for the root of the automation tree.  This fixes
+    	bug #489322, but some pieces of this class are the work of future bugs.
+    	* System.Windows.Automation/AutomationElementCollection.cs: Implement
+    	(bug #489330).
+    
+    	* System.Windows.Automation/*Pattern*.cs:
+    	* System.Windows.Automation/CacheRequest.cs:
+    	* System.Windows.Automation/AutomationFocusChangedEventArgs.cs: Stub-out.
+    	* Test/UIAutomationClientTests/*: Tests of UIAutomationClient classes.
+    	Created in Visual Studio to test Microsoft's implementation, first.  Only
+    	Automation and AutomationElement classes are thoroughly tested so far.
+    
+    In UIAutomation/UIAutomationSource/:
+    	* Mono.UIAutomation.Source/IElement.cs: Add SupportsProperty.
+    
+    In UIAutomation/UIAutomationTypes/:
+    	* System.Windows.Automation/TreeScope.cs: Add Flags attribute.
+    
+    In UIAutomationWinforms/UIAutomationWinforms/:
+    	* Makefile.am: Alphabetize.
+    	* Mono.UIAutomation.Winforms/SimpleControlProvider.cs: Add support for
+    	FrameworkId and ProcessId properties.
+    	* Mono.UIAutomation.Winforms/FragmentControlProvider.cs: Add support
+    	for RuntimeId property.
+    
+    In UiaDbusCoreBridge/:
+    	* DbusCore/Interfaces/IAutomationElement.cs: Add SupportsProperty.
+    	* UiaDbusCoreBridge/Wrappers/ProviderElementWrapper.cs: Implement
+    	SupportsProperty and fix AutomationId to expect an int from the
+    	provider.
+    	* UiaDbusCoreBridgeTests/ProviderElementWrapperTest.cs: Update
+    	AutomationId test to reflect above fix.
+    
+    svn path=/trunk/uia2atk/; revision=135899
+
+ UIAutomation/ChangeLog                             |    4 +
+ UIAutomation/UIAutomation.mds                      |    6 +-
+ UIAutomation/UIAutomationClient/AssemblyInfo.cs.in |    2 -
+ UIAutomation/UIAutomationClient/ChangeLog          |   34 +
+ UIAutomation/UIAutomationClient/Makefile.am        |   42 +-
+ .../TextPatternRange.cs                            |    5 +
+ .../System.Windows.Automation/AndCondition.cs      |   44 ++
+ .../System.Windows.Automation/Automation.cs        |  364 +++++++++
+ .../System.Windows.Automation/AutomationElement.cs |  602 ++++++++++++++--
+ .../AutomationElementCollection.cs                 |   28 +-
+ .../AutomationFocusChangedEventArgs.cs             |   57 ++
+ .../System.Windows.Automation/BasePattern.cs       |    4 +-
+ .../System.Windows.Automation/CacheRequest.cs      |    8 +-
+ .../System.Windows.Automation/Condition.cs         |   11 +-
+ .../System.Windows.Automation/DesktopElement.cs    |  229 ++++++
+ .../System.Windows.Automation/DockPattern.cs       |   66 ++
+ .../ExpandCollapsePattern.cs                       |   71 ++
+ .../System.Windows.Automation/GridItemPattern.cs   |   93 +++
+ .../System.Windows.Automation/GridPattern.cs       |   74 ++
+ .../System.Windows.Automation/InternalCondition.cs |   33 +
+ .../System.Windows.Automation/InvokePattern.cs     |   45 ++
+ .../MultipleViewPattern.cs                         |   78 ++
+ .../System.Windows.Automation/NotCondition.cs      |   45 ++
+ .../System.Windows.Automation/OrCondition.cs       |   44 ++
+ .../System.Windows.Automation/PropertyConditon.cs  |   73 ++
+ .../System.Windows.Automation/RangeValuePattern.cs |  106 +++
+ .../System.Windows.Automation/ScrollItemPattern.cs |   43 +
+ .../System.Windows.Automation/ScrollPattern.cs     |  123 +++
+ .../SelectionItemPattern.cs                        |   90 +++
+ .../System.Windows.Automation/SelectionPattern.cs  |   78 ++
+ .../System.Windows.Automation/SourceManager.cs     |  120 +++
+ .../System.Windows.Automation/TableItemPattern.cs  |   97 +++
+ .../System.Windows.Automation/TablePattern.cs      |   87 +++
+ .../System.Windows.Automation/TextPattern.cs       |   20 +
+ .../System.Windows.Automation/TogglePattern.cs     |   66 ++
+ .../System.Windows.Automation/TransformPattern.cs  |   92 +++
+ .../System.Windows.Automation/TreeWalker.cs        |  164 ++++
+ .../System.Windows.Automation/ValuePattern.cs      |   74 ++
+ .../System.Windows.Automation/WindowPattern.cs     |  120 +++
+ .../SampleForm/Form1.Designer.cs                   |  145 ++++
+ .../UIAutomationClientTests/SampleForm/Form1.cs    |   17 +
+ .../SampleForm/Form1.resources                     |  Bin 0 -> 172 bytes
+ .../UIAutomationClientTests/SampleForm/Form1.resx  |  120 +++
+ .../UIAutomationClientTests/SampleForm/Program.cs  |   19 +
+ .../SampleForm/Properties/AssemblyInfo.cs          |   36 +
+ .../SampleForm/Properties/Resources.Designer.cs    |   68 ++
+ .../SampleForm/Properties/Resources.resources      |  Bin 0 -> 172 bytes
+ .../SampleForm/Properties/Resources.resx           |  117 +++
+ .../SampleForm/Properties/Settings.Designer.cs     |   28 +
+ .../SampleForm/Properties/Settings.settings        |    7 +
+ .../SampleForm/SampleForm.csproj                   |   83 ++
+ .../UIAutomationClientTests.sln                    |   26 +
+ .../AutomationElementTest.cs                       |  803 ++++++++++++++++++++
+ .../UIAutomationClientTests/AutomationTest.cs      |  477 ++++++++++++
+ .../Properties/AssemblyInfo.cs                     |   36 +
+ .../UIAutomationClientTests.csproj                 |   76 ++
+ .../UIAutomationClient/UIAutomationClient.mdp      |   68 ++
+ .../UIAutomationClient/UIAutomationClient.mds      |   16 +
+ UIAutomation/UIAutomationSource/ChangeLog          |    6 +-
+ .../Mono.UIAutomation.Source/IElement.cs           |    2 +
+ UIAutomation/UIAutomationTypes/ChangeLog           |    4 +
+ .../System.Windows.Automation/TreeScope.cs         |    2 +-
+ 62 files changed, 5420 insertions(+), 78 deletions(-)
+
+commit f1a3ab650022feffe5fae32fff84169ea2d894db
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Thu Jun 4 20:34:41 2009 +0000
+
+    In UIAutomation/:
+    	* Makefile.am:
+    	* configure.ac:
+    	* UIAutomation.mds:
+    	* data/mono-uia.pc.in.in:
+    	* UIAutomationSource/*: Add UIAutomationSource to build.
+    
+    In UIAutomation/UIAutomationSource/:
+    	* Makefile.am:
+    	* AssemblyInfo.cs.in:
+    	* UIAutomationSource.mdp:
+    	* UIAutomationSource.mds: Infrastructure for UIAutomationSource
+    	assembly.
+    
+    	* Mono.UIAutomation.Source/IElement.cs: UIA automation element
+    	abstraction layer (bug #489322).
+    	* Mono.UIAutomation.Source/IAutomationSource.cs: UIA automation
+    	source abstraction layer (bug #489323).
+    
+    svn path=/trunk/uia2atk/; revision=135480
+
+ UIAutomation/ChangeLog                             |    8 ++
+ UIAutomation/Makefile.am                           |    2 +-
+ UIAutomation/UIAutomation.mds                      |    4 +
+ UIAutomation/UIAutomationSource/AssemblyInfo.cs.in |   56 ++++++++++++
+ UIAutomation/UIAutomationSource/ChangeLog          |   13 +++
+ UIAutomation/UIAutomationSource/Makefile.am        |   64 +++++++++++++
+ .../Mono.UIAutomation.Source/IAutomationSource.cs  |   40 ++++++++
+ .../Mono.UIAutomation.Source/IElement.cs           |   96 ++++++++++++++++++++
+ .../UIAutomationSource/UIAutomationSource.mdp      |   33 +++++++
+ .../UIAutomationSource/UIAutomationSource.mds      |   16 ++++
+ UIAutomation/configure.ac                          |    2 +
+ UIAutomation/data/mono-uia.pc.in.in                |    2 +-
+ 12 files changed, 334 insertions(+), 2 deletions(-)
+
+commit c5f557737fc8934901c121d6402c980fb9bb27a8
+Author: Andrés G. Aragoneses <knocte at gmail.com>
+Date:   Mon Apr 27 20:49:53 2009 +0000
+
+    fix changelog
+    
+    svn path=/trunk/uia2atk/; revision=132785
+
+ UIAutomation/UIAutomationProvider/ChangeLog |    4 ----
+ 1 files changed, 0 insertions(+), 4 deletions(-)
+
+commit 188ccb4721c179d820a310d42d0485be613e4ecb
+Author: Andrés G. Aragoneses <knocte at gmail.com>
+Date:   Mon Apr 27 20:47:50 2009 +0000
+
+    * UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ToolBarProvider.cs:
+      Handle dropdownmenu and style changed-events. Fixes final part of
+      bug#481357.
+    
+    * UIAutomation/UIAutomationProvider/ChangeLog:
+    
+    svn path=/trunk/uia2atk/; revision=132784
+
+ UIAutomation/UIAutomationProvider/ChangeLog |    6 +++++-
+ 1 files changed, 5 insertions(+), 1 deletions(-)
+
+commit e946632f92b5ffe550693e991ad8ee09c001fa1f
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Thu Apr 9 14:42:04 2009 +0000
+
+    In /:
+    	* Uia2Atk.mds:
+    	* UiaDbusCoreBridge/: Added UiaDbusCoreBridge sub-project.
+    	* .gitignore: Update.
+    
+    In UIAutomation/UIAutomationBridge/:
+    	* Mono.UIAutomation.Bridge/IAutomationBridge.cs: Whitespace fix.
+    
+    In UIAutomation/UIAutomationProvider/:
+    	* System.Windows.Automation.Provider/AutomationInteropProvider.cs:
+    	Add support for multiple bridges. Include UiaDbusCoreBridge by default.
+    
+    In UIAutomationWinforms/UIAutomationWinformsTests/:
+    	* TestHelper.cs: Update reflection into AutomationInteropProvider.
+    	* TextRangeProviderTest.cs: Use TestHelper for SetUp/TearDown.
+    
+    In UiaDbusCoreBridge/:
+    	* Initial commit of alternative DbusCore bridge for providing better
+    	support for Winforms and Moonlight apps in the Client API.
+    
+    svn path=/trunk/uia2atk/; revision=131391
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    4 +
+ .../Mono.UIAutomation.Bridge/IAutomationBridge.cs  |    2 +-
+ UIAutomation/UIAutomationProvider/ChangeLog        |    5 ++
+ .../AutomationInteropProvider.cs                   |   77 +++++++++++++-------
+ 4 files changed, 60 insertions(+), 28 deletions(-)
+
+commit 632581dc7a8da210d9c7a381883227e2576fa52b
+Author: Andrés G. Aragoneses <knocte at gmail.com>
+Date:   Thu Mar 19 14:28:56 2009 +0000
+
+    * UIAutomationProvider/System.Windows.Automation.Provider/AutomationInteropProvider.cs:
+      Update comment (since this methods are public because we mimic MS
+      API). Thanks to Sandy for noticing.
+    
+    svn path=/trunk/uia2atk/; revision=129776
+
+ UIAutomation/UIAutomationProvider/ChangeLog        |    6 ++++++
+ .../AutomationInteropProvider.cs                   |    6 +++---
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 0a31fcb61c3b653c0a0d4dd8c0e11842f2ee9c40
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Tue Mar 17 18:09:55 2009 +0000
+
+    * UIAutomation/configure.ac:
+    * UiaAtkBridge/configure.ac:
+    * UIAutomationWinforms/configure.ac: Bump version to 1.9.0.
+    UIAutomationWinforms will require mono-uia >= 1.9.0. Not sure yet
+    about UiaAtkBridge.
+    
+    svn path=/trunk/uia2atk/; revision=129613
+
+ UIAutomation/ChangeLog    |    6 ++++++
+ UIAutomation/configure.ac |    2 +-
+ 2 files changed, 7 insertions(+), 1 deletions(-)
+
+commit 6df6934a7529ac17f6719a8440875b4f3c2064bf
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Tue Mar 17 16:09:22 2009 +0000
+
+    2009-03-17  Brad Taylor  <brad at getcoded.net>
+    
+    In UIAutomationWinforms/:
+    	* NEWS: Update codename for 1.0.
+    
+    In UiaAtkBridge/:
+    	* NEWS: Update codename for 1.0.
+    
+    In UIAutomation/:
+    	* NEWS: Update codename for 1.0.
+    
+    
+    svn path=/trunk/uia2atk/; revision=129600
+
+ UIAutomation/ChangeLog |    4 ++++
+ UIAutomation/NEWS      |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletions(-)
+
+commit 2b371fa4ba2d9d4e7dc7c9752d77bc7d6e43936e
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Mar 13 13:10:31 2009 +0000
+
+    * UiaAtkBridge/NEWS:
+    * UIAutomation/NEWS:
+    * UiaAtkBridge/README:
+    * UIAutomation/configure.ac:
+    * UiaAtkBridge/configure.ac:
+    * UIAutomationWinforms/NEWS:
+    * UIAutomationWinforms/README:
+    * UIAutomationWinforms/configure.ac: Bump version to 1.0, update
+    dependencies.
+    
+    svn path=/trunk/uia2atk/; revision=129276
+
+ UIAutomation/ChangeLog    |    5 +++++
+ UIAutomation/NEWS         |    3 +++
+ UIAutomation/configure.ac |    2 +-
+ 3 files changed, 9 insertions(+), 1 deletions(-)
+
+commit e0f8b8cbcaadc738b98276204a08e004211d4a1c
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Thu Mar 12 19:22:59 2009 +0000
+
+    * UIAutomation/UIAutomationBridge/Mono.UIAutomation.Services/Log.cs:
+      Fix typo in string formatting.
+    
+    svn path=/trunk/uia2atk/; revision=129180
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    5 +++++
+ .../Mono.UIAutomation.Services/Log.cs              |    4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit c139f0092da9c69f83227340f317e11c980bf910
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Thu Mar 12 18:29:36 2009 +0000
+
+    2009-03-12  Brad Taylor  <brad at getcoded.net>
+    
+    In UIAutomationBridge/:
+    	* Mono.UIAutomation.Services/Log.cs: Add log methods that allow
+    	Exceptions to be dumped.
+    
+    
+    svn path=/trunk/uia2atk/; revision=129173
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    5 +++++
+ .../Mono.UIAutomation.Services/Log.cs              |   10 ++++++++++
+ 2 files changed, 15 insertions(+), 0 deletions(-)
+
+commit 8e6404d662e013196888aa516ab7358c664cb73a
+Merge: 655476a 5efc82e 487a1c2
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Mon Mar 9 18:46:09 2009 +0000
+
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/BaseTextImplementor.cs: Handling
+      Caret: property added: CaretOffset, method added: SetCaretOffSet,
+      event-related methods: RaiseAutomationPropertyChangedEvent,
+      RaiseAutomationEvent. Protected CaretProvider property added.
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/EditableTextImplementor.cs: File
+      renamed to EditableTextImplementorHelper.
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/EditableTextImplementorHelper.cs:
+      Renamed from EditableTextImplementor. No need to use ITextProvider.
+      Clipboard handling by using provider.GetPatternProvider. Handling
+      Editable state.
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/ITextImplementor.cs: Handling Caret:
+      property added: CaretOffset, method added: SetCaretOffSet,
+      event-related methods: RaiseAutomationPropertyChangedEvent,
+      RaiseAutomationEvent.
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/List.cs: Using
+      EditableTextImplementorHelper to handle Atk.EditableTextImplementor
+      methods, events and editable state. Using TableExpert in
+      GetColumnDescription, GetColumnHeader, GetRowDescription and
+      GetRowHeader.
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/TreeItem.cs:
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/ListItem.cs: Using
+      EditableTextImplementorHelper to handle Atk.EditableTextImplementor
+      methods, events and editable state.
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/Makefile.am:
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/UiaAtkBridge.mdp:
+      EditableTextImplementor.cs renamted to
+      EditableTextImplementorHelper.cs.
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/Spinner.cs: Using
+      provider.GetPatternProvider instead of explicit casting.
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/TextBoxEntryView.cs: Using
+      EditableTextImplementorHelper to handle Atk.EditableTextImplementor
+      methods, events and editable state. TextImplementorHelper handles
+      Caret events.
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/TextProviderTextImplementor.cs:
+      IText field removed, using base protected property CaretProvider
+      instead.
+    
+    * uia2atk/UIAutomation/UIAutomationBridge/Makefile.am:
+    * uia2atk/UIAutomation/UIAutomationBridge/UIAutomationBridge.mdp:
+      IClipboardSupport, IEditableRange and IText moved to
+      UIAutomationProvider.
+    
+    * uia2atk/UIAutomation/UIAutomationBridge/Mono.UIAutomation.Bridge/IText.cs:
+    * uia2atk/UIAutomation/UIAutomationBridge/Mono.UIAutomation.Bridge/IEditableRange.cs:
+    * uia2atk/UIAutomation/UIAutomationBridge/Mono.UIAutomation.Bridge/IClipboardSupport.cs:
+      Moved to UIAutomationProvider.
+    
+    * uia2atk/UIAutomation/UIAutomationProvider/Makefile.am:
+    * uia2atk/UIAutomation/UIAutomationProvider/UIAutomationProvider.mdp:
+    * uia2atk/UIAutomation/UIAutomationProvider/UIAutomationProvider.dll.sources:
+      IClipboardSupport, IEditableRange and IText moved from
+      UIAutomationBridge.
+    
+    * uia2atk/UIAutomation/UIAutomationProvider/System.Windows.Automation.Provider/ICaretProvider.cs:
+    * uia2atk/UIAutomation/UIAutomationProvider/System.Windows.Automation.Provider/IClipboardProvider.cs:
+    * uia2atk/UIAutomation/UIAutomationProvider/System.Windows.Automation.Provider/IEditableRangeProvider.cs:
+      Moved from UIAutomationBridge.
+    
+    * uia2atk/UIAutomation/UIAutomationTypes/Makefile.am:
+    * uia2atk/UIAutomation/UIAutomationTypes/UIAutomationTypes.mdp:
+    * uia2atk/UIAutomation/UIAutomationTypes/UIAutomationTypes.dll.sources:
+      Internal classes added: ClipboardPatternIdentifiers,
+      EditableRangePatternIdentifiers and CaretPatternIdentifiers.
+    
+    * uia2atk/UIAutomation/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs:
+      Class added, used by ICaretProvider.
+    
+    * uia2atk/UIAutomation/UIAutomationTypes/System.Windows.Automation/ClipboardPatternIdentifiers.cs:
+      Class added, used by IClipboardProvider.
+    
+    * uia2atk/UIAutomation/UIAutomationTypes/System.Windows.Automation/EditableRangePatternIdentifiers.cs:
+      Class added, used by IEditableRangeProvider.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Makefile.am:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.mdp:
+      UpDownBase Events/Behaviors moved to NumericUpDown. Added behaviors
+      to match UIAutomationTypes added: CaretProvider, ClipboardProvider
+      and EditableRangeProvider.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/ListView/ListItemClipboardProviderBehavior.cs:
+      Behavior that implements IClipboardProvider.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/ListView/ListItemEmbeddedImageProviderBehavior.cs:
+      Class renamed: EmbeddedImageProviderBehavior ->
+      ListItemEmbeddedImageProviderBehavior
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/ListView/ListItemValueProviderBehavior.cs:
+      IClipboardProvider implementation moved to
+      ListItemClipboardProviderBehavior.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/NumericUpDown:
+      NumericUpDown Behaviors.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/NumericUpDown/EditableRangeProviderBehavior.cs:
+      Implements IEditableRangeProvider in NumericUpDown.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/TextBox/CaretProviderBehavior.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/TextBox/ClipboardProviderBehavior.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Events/NumericUpDown/RangeValuePatternValueEvent.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Events/NumericUpDown/RangeValuePatternMinimumEvent.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Events/NumericUpDown/RangeValuePatternMaximumEvent.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/NumericUpDown/RangeValueProviderBehavior.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Events/NumericUpDown/RangeValuePatternIsReadOnlyEvent.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Events/NumericUpDown/RangeValuePatternSmallChangeEvent.cs:
+      Moved from UpDownBase.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Events/UpDownBase/RangeValuePatternValueEvent.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/UpDownBase/RangeValueProviderBehavior.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Events/UpDownBase/RangeValuePatternMinimumEvent.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Events/UpDownBase/RangeValuePatternMaximumEvent.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Events/UpDownBase/RangeValuePatternIsReadOnlyEvent.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Events/UpDownBase/RangeValuePatternSmallChangeEvent.cs:
+      Moved to NumericUpDown.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/TextBox/TextProviderBehavior.cs:
+      IText implementation moved to CaretProviderBehavior, IClipboard
+      implementation moved to ClipboardProviderBehavior.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Events/NumericUpDown:
+      NumericUpDown Events.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/TextBoxProvider.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/DomainUpDownProvider.cs:
+      Setting behaviors: Clipboard and Caret.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ListItemProvider.cs:
+      Setting default internal Clipboard behavior.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ListViewProvider.cs:
+      Setting Clipboard behavior. Class EmbeddedImageProviderBehavior
+      renamed to ListItemEmbeddedImageProviderBehavior.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/NumericUpDownProvider.cs:
+      Setting behavior: EditableRange.
+    
+    svn path=/trunk/uia2atk/; revision=128899
+
+commit e79eb13be10d0d7c597d0a8aa0542bdcc258f92b
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Thu Mar 5 21:23:03 2009 +0000
+
+    * UIAutomationTypes/UIAutomationTypes.mdp: Removing GtkDesignInfo.
+      InsertDeleteTextPatternIdentifiers.cs file added to project.
+    
+    * UIAutomationTypes/UIAutomationTypesTests.mdp: Removing GtkDesignInfo.
+    
+    svn path=/trunk/uia2atk/; revision=128726
+
+ UIAutomation/UIAutomationTypes/ChangeLog           |    7 +++++++
+ .../UIAutomationTypes/UIAutomationTypes.mdp        |    6 +++---
+ .../UIAutomationTypes/UIAutomationTypesTests.mdp   |    1 -
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 3619aaf642d92b2805f47278080bd6f1bd78704e
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Thu Mar 5 21:22:03 2009 +0000
+
+    * UIAutomationProvider/UIAutomationProvider.mdp: Removing GtkDesignInfo.
+      IInsertDeleteTextProvider.cs file added.
+    
+    * UIAutomationProvider/UIAutomationProviderTests.mdp: Removing
+      GtkDesignInfo.
+    
+    svn path=/trunk/uia2atk/; revision=128725
+
+ UIAutomation/UIAutomationProvider/ChangeLog        |    7 +++++++
+ .../UIAutomationProvider/UIAutomationProvider.mdp  |    4 ++--
+ .../UIAutomationProviderTests.mdp                  |    1 -
+ 3 files changed, 9 insertions(+), 3 deletions(-)
+
+commit e9918f9e92f257d4b9b515f023d28c732d063c7d
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Thu Mar 5 18:45:15 2009 +0000
+
+    2009-03-05  Brad Taylor  <brad at getcoded.net>
+    
+    In UIAutomationWinforms/UIAutomationWinforms/:
+    	Fixes #465467, #465018, #465091, #466598 and #465095.
+    	* Mono.UIAutomation.Winforms/TextNormalizer.cs:
+    	* Mono.UIAutomation.Winforms/TextRangeProvider.cs: Special case
+    	MaskedTextBox so that we return .ToDisplayString () not .Text, as the
+    	former is what is actually displayed.
+    
+    	* Mono.UIAutomation.Winforms/TextBoxProvider.cs: Move MaxLength here so
+    	that it can be used by other providers.
+    
+    	* Mono.UIAutomation.Winforms/MaskedTextBoxProvider.cs: Add a new
+    	InsertDeleteTextProvider to the list of behaviors.  This is necessary
+    	as simply manipulating the ValuePattern in the bridge won't work.
+    	The semantics of Atk.Editable's InsertText are better mapped to a
+    	character by character replace when the insertion is happening on a
+    	blank (represented by the '_' character) cell.
+    
+    	* Mono.UIAutomation.Winforms.Behaviors/TextBox/TextProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/TextBox/ValueProviderBehavior.cs:
+    	When dealing with the MaskedTextBox control, return .ToDisplayString ()
+    	instead of .Text.
+    
+    	* Makefile.am:
+    	* Mono.UIAutomation.Winforms.Behaviors/MaskedTextBox:
+    	* Mono.UIAutomation.Winforms.Behaviors/MaskedTextBox/InsertDeleteTextProviderBehavior.cs:
+    	Implement the new behavior so that Atk.EditableText's methods can be
+    	proxied directly to the actual control.  This will allow us to handle
+    	these methods as the user expects.
+    
+    In UiaAtkBridge/Test/UiaAtkBridgeTest/:
+    	* BridgeTests.cs: Add an entry in GetAccessible () for
+    	MaskedTextBoxEntry.
+    
+    	* BridgeTester.cs: Add a test for MaskedTextBox's EditableText
+    	interface.
+    
+    In UiaAtkBridge/UiaAtkBridge/:
+    	* EditableTextImplementor.cs: Use the new IInsertDeleteTextProvider
+    	interface so that MaskedTextBox can be properly supported.
+    
+    In UIAutomation/UIAutomationProvider/:
+    	* Makefile.am:
+    	* System.Windows.Automation.Provider/IInsertDeleteTextProvider.cs: Add
+    	a new internal IInsertDeleteTextProvider class for MaskedTextBox.
+    
+    In UIAutomation/UIAutomationTypes/:
+    	* Makefile.am:
+    	* System.Windows.Automation/InsertDeleteTextPatternIdentifiers.cs:
+    	Add a new internal InsertDeleteTextPatternIdentifiers to support the
+    	new IInsertDeleteTextProvider.
+    
+    
+    svn path=/trunk/uia2atk/; revision=128716
+
+ UIAutomation/UIAutomationProvider/ChangeLog        |    6 +++
+ UIAutomation/UIAutomationProvider/Makefile.am      |    1 +
+ .../IInsertDeleteTextProvider.cs                   |   37 +++++++++++++++
+ UIAutomation/UIAutomationTypes/ChangeLog           |    7 +++
+ UIAutomation/UIAutomationTypes/Makefile.am         |    1 +
+ .../InsertDeleteTextPatternIdentifiers.cs          |   47 ++++++++++++++++++++
+ 6 files changed, 99 insertions(+), 0 deletions(-)
+
+commit fe7932c8f0cad7aa2b9ee2e3c7edbd6aa0ab1a07
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Thu Feb 26 16:47:57 2009 +0000
+
+    * UIAutomation/WindowsBase/System.Windows/Rect.cs: For Rect.Empty,
+    return Size.Empty for Size. Previously this would throw an exception
+    on Size construction.
+    
+    svn path=/trunk/uia2atk/; revision=128117
+
+ UIAutomation/ChangeLog                          |    6 ++++++
+ UIAutomation/WindowsBase/System.Windows/Rect.cs |    2 ++
+ 2 files changed, 8 insertions(+), 0 deletions(-)
+
+commit a1bb408143a8743c1ebe078320953b6efd7e650e
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Feb 20 23:31:27 2009 +0000
+
+    * UIAutomation/UIAutomationTypes/UIAutomationTypes.mdp:
+    * UIAutomation/UIAutomationBridge/UIAutomationBridge.mdp:
+    * UIAutomation/UIAutomationTypes/UIAutomationTypesTests.mdp:
+    * UIAutomation/UIAutomationProvider/UIAutomationProvider.mdp:
+    * UIAutomation/UIAutomationProvider/UIAutomationProviderTests.mdp:
+    Point projects at Makefile.am, not Makefile.
+    
+    svn path=/trunk/uia2atk/; revision=127594
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    5 +++++
+ .../UIAutomationBridge/UIAutomationBridge.mdp      |    4 ++--
+ UIAutomation/UIAutomationProvider/ChangeLog        |    6 ++++++
+ .../UIAutomationProvider/UIAutomationProvider.mdp  |    4 ++--
+ .../UIAutomationProviderTests.mdp                  |    4 ++--
+ UIAutomation/UIAutomationTypes/ChangeLog           |    6 ++++++
+ .../UIAutomationTypes/UIAutomationTypes.mdp        |    4 ++--
+ .../UIAutomationTypes/UIAutomationTypesTests.mdp   |    4 ++--
+ 8 files changed, 27 insertions(+), 10 deletions(-)
+
+commit 955c9720e266541598204e01e8d722b2c3e3ebfe
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Wed Feb 18 20:07:57 2009 +0000
+
+    * uia2atk/UiaAtkBridge/Test/UiaAtkBridgeTest/BridgeTests.cs: Testing
+      Atk.Image in ListView's children. [For Bug #459152]
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/TreeItem.cs: Implementation
+      Atk.ImageImplementor. [Fixes bug #459152]
+    
+    * uia2atk/UIAutomation/UIAutomationTypes/AssemblyInfo.cs.in:
+    * uia2atk/UIAutomation/UIAutomationProvider/AssemblyInfo.cs.in: Friend
+      assembly UIAutomationWinformsTest added.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/ListView/ListItemEmbeddedImageProviderBehavior.cs:
+      Using ListItem location and CheckBox width to return a valid
+      location. [Fixes bug #459152]
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ListViewProvider.cs:
+      Public property CheckboxProvider added.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinformsTests/BaseProviderTest.cs:
+      New protected method: TestEmbeddedImagePattern_All.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinformsTests/ListViewProviderTest.cs:
+      New Test Bug459152Test. Tests IEmbeddedImagePattern.
+    
+    svn path=/trunk/uia2atk/; revision=127318
+
+ .../UIAutomationProvider/AssemblyInfo.cs.in        |    2 ++
+ UIAutomation/UIAutomationProvider/ChangeLog        |    4 ++++
+ UIAutomation/UIAutomationTypes/AssemblyInfo.cs.in  |    2 ++
+ UIAutomation/UIAutomationTypes/ChangeLog           |    4 ++++
+ 4 files changed, 12 insertions(+), 0 deletions(-)
+
+commit 5450ba50dfd26e6ce7bf059fb9a897e3aa423afb
+Author: Andrés G. Aragoneses <knocte at gmail.com>
+Date:   Sun Feb 8 04:42:03 2009 +0000
+
+    * UIAutomation/UIAutomationTypes/UIAutomationTypesTests.mdp:
+    * UIAutomation/UIAutomationProvider/UIAutomationProviderTests.mdp:
+    Change nunit version.
+    
+    svn path=/trunk/uia2atk/; revision=126238
+
+ UIAutomation/UIAutomationProvider/ChangeLog        |    4 ++++
+ .../UIAutomationProviderTests.mdp                  |    4 ++--
+ UIAutomation/UIAutomationTypes/ChangeLog           |    4 ++++
+ .../UIAutomationTypes/UIAutomationTypesTests.mdp   |    4 ++--
+ 4 files changed, 12 insertions(+), 4 deletions(-)
+
+commit c02f87cccf7b68846ed9c3883c35360a154c368a
+Author: Andrés G. Aragoneses <knocte at gmail.com>
+Date:   Sun Feb 8 00:23:53 2009 +0000
+
+    * UIAutomationProvider/System.Windows.Automation.Provider/AutomationInteropProvider.cs:
+      Add meat for bug#469347.
+    
+    svn path=/trunk/uia2atk/; revision=126217
+
+ UIAutomation/UIAutomationProvider/ChangeLog        |    5 +++++
+ .../AutomationInteropProvider.cs                   |    3 +++
+ 2 files changed, 8 insertions(+), 0 deletions(-)
+
+commit 7c6ccba1368aca70165ed5d306bf3d5f273ffd13
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Thu Feb 5 23:40:10 2009 +0000
+
+    * System.Windows.Automation/AutomationElementIdentifiers.cs:
+      Add internal IsNotifyIcon property.
+    
+    * Mono.UIAutomation.Winforms/BalloonWindowProvider.cs, Makefile.am:
+      Add BalloonWindowProvider.
+    
+    * Mono.UIAutomation.Winforms/Global.cs,
+      Mono.UIAutomation.Winforms/FormListener.cs,
+      Mono.UIAutomation.Winforms/KeyFilter.cs, Makefile.am:
+      Separate KeyFilter from window creation so that we won't add a new
+      KeyFilter for every window.
+    
+    * Mono.UIAutomation.Winforms/ContainerPanelProvider.cs, Makefile.am:
+      Add ContainerPanel provider.
+    
+    * ProgressBar.cs: Use TextExpert to find character count; fix NRE.
+    
+    * Window.cs: Handle SWF BalloonWindow.
+    
+    * AutomationBridge.cs: handle Table control type like DataGrid.
+    
+    * AtkTester.cs, AtkTests.cs: Remove Resizable test for panels.
+    
+    * BridgeTester.cs, BridgeTests.cs: Add ContainerPanel test.
+    
+    * BridgeTester.cs: Remove ContainerPanelIsResizable.
+    
+    * Gailtester.cs: Remove ContainerPanelIsResizable.
+    
+    svn path=/trunk/uia2atk/; revision=125959
+
+ UIAutomation/UIAutomationTypes/ChangeLog           |    5 +++++
+ .../AutomationElementIdentifiers.cs                |    6 ++++++
+ 2 files changed, 11 insertions(+), 0 deletions(-)
+
+commit bde7f85c02bc2f66865feaa40663373eaa1a6ee4
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Thu Feb 5 21:10:05 2009 +0000
+
+    * UIAutomationBridge/UIAutomationBridge.mdp:
+      Mono.UIAutomation.Services/Log.cs file included in project.
+    
+    svn path=/trunk/uia2atk/; revision=125932
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    5 +++++
+ .../UIAutomationBridge/UIAutomationBridge.mdp      |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletions(-)
+
+commit 8546f74f218e3feba6a06c2f5f6b818dcde27270
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Thu Feb 5 18:09:27 2009 +0000
+
+    2009-02-05  Brad Taylor  <brad at getcoded.net>
+    
+    In UIAutomationWinforms/UIAutomationWinforms/:
+    	* Mono.UIAutomation.Winforms/DataGridProvider.cs: Remove unneccessary
+    	Console.WriteLines.
+    
+    	* Mono.UIAutomation.Winforms/ListProvider.cs:
+    	* Mono.UIAutomation.Winforms/ProviderFactory.cs: Convert
+    	Console.WriteLine to Log.Warn and Log.Error.
+    
+    	* Mono.UIAutomation.Winforms.Behaviors/ListView/HeaderItemInvokeProvider.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListBox/SelectionPatternSelectionEvent.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListBox/SelectionPatternInvalidatedEvent.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListView/ListItemGridItemPatternRowEvent.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/DataGrid/DataItemValueProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Events/ComboBox/SelectionPatternInvalidatedEvent.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListBox/ScrollPatternVerticalViewSizeEvent.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListBox/ListItemAutomationNamePropertyEvent.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListView/ListItemGridItemPatternColumnEvent.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListBox/ScrollPatternHorizontalViewSizeEvent.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/DataGrid/DataItemEditValueProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListBox/SelectionPatternCanSelectMultipleEvent.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/ListView/GroupExpandCollapseProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListView/SelectionPatternCanSelectMultipleEvent.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListBox/ListItemSelectionItemPatternIsSelectedEvent.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListBox/ListItemSelectionItemPatternElementAddedEvent.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListBox/ListItemSelectionItemPatternElementRemovedEvent.cs:
+    	* Mono.UIAutomation.Winforms.Events/ListBox/ListItemSelectionItemPatternElementSelectedEvent.cs:
+    	Remove reflection for all events, removing the C.WLs in the process.
+    
+    In UIAutomation/UIAutomationBridge/:
+    	* Makefile.am:
+    	* Mono.UIAutomation.Services:
+    	* Mono.UIAutomation.Services/Log.cs: Add new Log class.
+    
+    
+    svn path=/trunk/uia2atk/; revision=125897
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    6 +
+ UIAutomation/UIAutomationBridge/Makefile.am        |    3 +-
+ .../Mono.UIAutomation.Services/Log.cs              |  139 ++++++++++++++++++++
+ 3 files changed, 147 insertions(+), 1 deletions(-)
+
+commit 6435c482dc2057bd8c995f4caa86c2e81ea88c1a
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Jan 28 03:58:44 2009 +0000
+
+    * Mono.UIAutomation.Bridge/IText.cs: Add GetSelection.
+    
+    * Mono.UIAutomation.Winforms/DomainUpDownProvider.cs,
+      Mono.UIAutomation.Winforms.Behaviors/TextBox/TextProviderBehavior.cs,
+      Mono.UIAutomation.Winforms.Events/TextBox/TextPatternCaretMovedEvent.cs,
+      Mono.UIAutomation.Winforms.Events/TextBox/TextPatternTextSelectionChangedEvent.cs:
+      Support TextProvider for DomainUpDown.
+    
+    * Mono.UIAutomation.Winforms.Behaviors/TextBox/TextProviderBehavior.cs,
+      Some selection-related fixes.
+      Use document.GetCharAtIndex; remove code that does the same thing.
+    
+    * List.cs: Implement clipboard support in ListWithEditableText.
+    
+    * Spinner.cs, Slider.cs, List.cs, TextBoxEntryView.cs,
+      BaseTextImplementor.cs: Fix text-changed events when typing.
+    
+    * BaseTextImplementor.cs, ITextImplementor.cs,
+      TextProviderTextImplementor.cs: Support selections when
+      TextProvider is available.
+      Note: Uses internal api for GetSelection.
+    
+    * BaseTextImplementor.cs: Hack to fix text-changed:delete events.
+    
+    * List.cs: Emit caret-moved and selection-changed events for
+      ListWithEditableText.
+    
+    * BridgeTester.cs: Fix ToolStripTextBox test.
+    
+    * BridgeTests.cs: Add text-event test.
+    
+    svn path=/trunk/uia2atk/; revision=124749
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    4 ++++
+ .../Mono.UIAutomation.Bridge/IText.cs              |    6 +-----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit bc6bd12b9e914b0dcc1b37c3630f13bc013381a1
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Tue Jan 27 23:01:47 2009 +0000
+
+    * uia2atk/UIAutomation/UIAutomationBridge/UIAutomationBridge.mdp:
+    * uia2atk/UIAutomation/UIAutomationProvider/UIAutomationProvider.mdp:
+      Update project files to match makefiles, since there is no
+      synchronization on these projects.
+    
+    svn path=/trunk/uia2atk/; revision=124727
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    5 +++++
+ .../UIAutomationBridge/UIAutomationBridge.mdp      |    1 -
+ UIAutomation/UIAutomationProvider/ChangeLog        |    5 +++++
+ .../UIAutomationProvider/UIAutomationProvider.mdp  |    3 ++-
+ 4 files changed, 12 insertions(+), 2 deletions(-)
+
+commit 9adc82c0fda67b44bed317ceaa35cbcaeef223d5
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Tue Jan 27 22:54:58 2009 +0000
+
+    * uia2atk/UIAutomation/UIAutomationProvider/AssemblyInfo.cs.in: Add
+      InternalsVisibleTo for UiaAtkBridge.
+    
+    svn path=/trunk/uia2atk/; revision=124725
+
+ .../UIAutomationProvider/AssemblyInfo.cs.in        |    1 +
+ UIAutomation/UIAutomationProvider/ChangeLog        |    4 ++++
+ 2 files changed, 5 insertions(+), 0 deletions(-)
+
+commit 71e13ad6fafce3eacbd3dfedc340aa92723ffead
+Merge: 8f578ec 78aa5db
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Tue Jan 27 22:31:22 2009 +0000
+
+    2009-01-27  Brad Taylor  <brad at getcoded.net>
+    
+    In UIAutomationWinforms/UIAutomationWinforms/:
+    	* Makefile.am:
+    	* Mono.UIAutomation.Winforms.Behaviors/Button/EmbeddedImageProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/ListItem/EmbeddedImageProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/PictureBox/EmbeddedImageProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/ToolStripItem/EmbeddedImageProviderBehavior.cs:
+    	Add IEmbeddedImageProvider support.
+    	* Mono.UIAutomation.Winforms/ButtonProvider.cs:
+    	* Mono.UIAutomation.Winforms/CheckBoxProvider.cs:
+    	* Mono.UIAutomation.Winforms/ListItemProvider.cs:
+    	* Mono.UIAutomation.Winforms/StatusBarProvider.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/PictureBox:
+    	* Mono.UIAutomation.Winforms/PictureBoxProvider.cs:
+    	* Mono.UIAutomation.Winforms/RadioButtonProvider.cs:
+    	* Mono.UIAutomation.Winforms/ToolStripItemProvider.cs:
+    	* Mono.UIAutomation.Winforms/MessageBoxFormProvider.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/Button/InvokeProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/CheckBox/ToggleProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/ToolStripItem/InvokeProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/ToolStripButton/InvokeProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/PopupButtonPanel/InvokeProviderBehavior.cs:
+    	* Mono.UIAutomation.Winforms.Behaviors/RadioButton/SelectionItemProviderBehavior.cs:
+    	Remove IEmbeddedImage support, add the new, cleaner IEmbeddedImageProvider
+    	behavior.
+    
+    In UiaAtkBridge/UiaAtkBridge/:
+    	* Image.cs:
+    	* Button.cs:
+    	* ListItem.cs:
+    	* HeaderItem.cs:
+    	* RadioButton.cs:
+    	* CheckBoxButton.cs:
+    	* TextImageLabel.cs:
+    	* ImageImplementorHelper.cs: Use new IEmbeddedImageProvider instead of
+    	hacky IEmbeddedImage interface.
+    
+    In UIAutomation/UIAutomationProvider/:
+    	* Makefile.am:
+    	* System.Windows.Automation.Provider/IEmbeddedImageProvider.cs:
+    	Replace IEmbeddedImage with a real internal provider class.
+    
+    In UIAutomation/UIAutomationBridge/:
+    	* Makefile.am: Rename IEmbeddedImage to IEmbeddedImageProvider and move
+    	it to UIAutomationProvider.
+    
+    In UIAutomation/UIAutomationTypes/:
+    	* Makefile.am:
+    	* System.Windows.Automation/EmbeddedImagePatternIdentifiers.cs:
+    	Add support class for IEmbeddedImageProvider.
+    
+    
+    svn path=/trunk/uia2atk/; revision=124721
+
+commit 7910a8a06864ac0feabbb03e0df60a8fc45a4f96
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Thu Jan 22 23:39:10 2009 +0000
+
+    * UIAutomationBridge/UIAutomationBridge.mdp: IClipboardSupport.cs file
+      added.
+    
+    svn path=/trunk/uia2atk/; revision=124264
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    4 ++++
+ .../UIAutomationBridge/UIAutomationBridge.mdp      |    5 +++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 28381cc18e4d4e90cc8785f0c49bce7e3d8e5a3a
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Thu Jan 22 16:40:27 2009 +0000
+
+    2009-01-22  Brad Taylor  <brad at getcoded.net>
+    
+    In UIAutomationWinforms/UIAutomationWinforms/:
+    	* Mono.UIAutomation.Winforms.Behaviors/TextBox/TextProviderBehavior.cs:
+    	Add an internal interface to support the clipboard, needed for
+    	Atk.EditableText.
+    
+    In UiaAtkBridge/Test/AtkTest/:
+    	* AtkTester.cs: Test Cut, Copy and Paste for Atk.EditableText.
+    
+    In UiaAtkBridge/UiaAtkBridge/:
+    	* TextBoxEntryView.cs: Use internal IClipboardSupport interface to
+    	implement Cut, Copy and Paste for Atk.EditableText.
+    
+    In UIAutomation/UIAutomationBridge/:
+    	* Makefile.am:
+    	* Mono.UIAutomation.Bridge/IClipboardSupport.cs:
+    	Add an internal interface to allow us to perform clipboard operations
+    	on UIA providers.
+    
+    
+    svn path=/trunk/uia2atk/; revision=124223
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    8 ++++-
+ UIAutomation/UIAutomationBridge/Makefile.am        |    1 +
+ .../Mono.UIAutomation.Bridge/IClipboardSupport.cs  |   37 ++++++++++++++++++++
+ 3 files changed, 45 insertions(+), 1 deletions(-)
+
+commit d86c5d348980fa4b2ad820486e6611fda93f6715
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Thu Jan 15 19:12:57 2009 +0000
+
+    2009-01-15  Brad Taylor  <brad at getcoded.net>
+    
+    In UIAutomation/UIAutomationProvider/:
+    	* System.Windows.Automation.Provider/AutomationInteropProvider.cs:
+    	Implement ReturnRawElementProvider as a hashtable of weak references
+    	(because marshaling the object is not only not possible, but makes no
+    	sense).  Add RetrieveAndDeleteProvider to allow the contents of the
+    	weak reference to be retrieved.
+    
+    	* AssemblyInfo.cs.in: Allow UIAutomationWinforms to access internal
+    	methods.
+    
+    
+    svn path=/trunk/uia2atk/; revision=123523
+
+ .../UIAutomationProvider/AssemblyInfo.cs.in        |    2 +
+ UIAutomation/UIAutomationProvider/ChangeLog        |   11 ++++++++
+ .../AutomationInteropProvider.cs                   |   25 +++++++++++++++++++-
+ 3 files changed, 37 insertions(+), 1 deletions(-)
+
+commit ded8469303f7dff8e3b6a64df21169198c353b0c
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Fri Jan 9 11:46:06 2009 +0000
+
+    Add internal CaretMoved event for text boxes.
+    Catch IndexOutOfRange exceptions in atk GetText methods.
+    
+    svn path=/trunk/uia2atk/; revision=122866
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    4 ++
+ UIAutomation/UIAutomationBridge/Makefile.am        |    3 +-
+ .../Mono.UIAutomation.Bridge/IText.cs              |   41 ++++++++++++++++++++
+ UIAutomation/UIAutomationTypes/ChangeLog           |    5 ++
+ .../TextPatternIdentifiers.cs                      |    6 +++
+ 5 files changed, 58 insertions(+), 1 deletions(-)
+
+commit 9a8c79aba8dbe69bc174b5fa112f290a1b024231
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Fri Jan 2 16:04:15 2009 +0000
+
+    Add internal WindowDeactivated event and use to disable active state when a
+    window loses focus [bug 445199]
+    
+    svn path=/trunk/uia2atk/; revision=122340
+
+ UIAutomation/UIAutomationTypes/ChangeLog           |    5 +++++
+ .../AutomationElementIdentifiers.cs                |    6 ++++++
+ 2 files changed, 11 insertions(+), 0 deletions(-)
+
+commit 85caafa987bc8c261444887291488808fa28f9ee
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Dec 17 23:06:07 2008 +0000
+
+    * System.Windows.Automation/GridPatternIdentifiers.cs: Add internal
+      column-reordered automation event.
+    
+    * Mono.UIAutomation.Winforms.Behaviors/ListView/GridProviderBehavior.cs,
+      Mono.UIAutomation.Winforms.Events/ProviderEventType.cs,
+      Mono.UIAutomation.Winforms.Events/ListView/GridPatternColumnReorderedEvent.cs,
+      Makefile.am: Add column-reordered event for ListView.
+    
+    * dataGrid.cs: Listen for column-reordered.
+    
+    * Tab.cs, TextContainer.cs, Makefile.am, UiaAtkBridge.mdp,
+      AutomationBridge.cs: Support Tab and TabItem.
+    
+    * AtkTests.cs: Enable TabControl test.
+    * AtkTester.cs: Fix TabControl selection test and remove extra
+      InterfaceComponent..
+    
+    * AtkTester.cs: Generalize transient logic in Focus().
+    
+    * AtkTester.cs: Test that Transient matches parent's ManagesDescendants.
+    
+    svn path=/trunk/uia2atk/; revision=121733
+
+ UIAutomation/UIAutomationTypes/ChangeLog           |    5 +++++
+ .../GridPatternIdentifiers.cs                      |    5 +++++
+ 2 files changed, 10 insertions(+), 0 deletions(-)
+
+commit 7d7a5308eeb080803127fa8a81c89fe2d7cd0795
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Wed Dec 3 21:15:25 2008 +0000
+
+    * BridgeTests.cs: Test StatusBar children after panel removed.
+    
+    * Mono.UIAutomation.Winforms.Behaviors/UpDownBase/RangeValueProviderBehavior.cs:
+      Rework IEditableRange.
+    
+     * Mono.UIAutomation.Winforms.Behaviors/UpDownBase/ValueProviderBehavior.cs:
+      Check ReadOnly before invoking.
+    
+    * Spinner.cs: Adapt for new EditableRange interface.
+    
+    svn path=/trunk/uia2atk/; revision=120642
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    5 +++++
+ .../Mono.UIAutomation.Bridge/IEditableRange.cs     |    4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 9eb2c933f2846721166acac0c0551d11e433d3c1
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Wed Dec 3 16:44:42 2008 +0000
+
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/Image.cs:
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/Button.cs:
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/TextLabel.cs:
+    * uia2atk/UIAutomation/UIAutomationBridge/Mono.UIAutomation.Bridge/IEmbeddedImage.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/StatusBarProvider.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/PictureBoxProvider.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/Button/InvokeProviderBehavior.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/CheckBox/ToggleProviderBehavior.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/RadioButton/SelectionItemProviderBehavior.cs:
+      Remove IEmbeddedImage.HasImage property...just check Bounds.IsEmpty
+      instead.
+    
+    svn path=/trunk/uia2atk/; revision=120613
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    5 +++++
+ .../Mono.UIAutomation.Bridge/IEmbeddedImage.cs     |    2 --
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit ebc70622c8a57096882e3da02626d2aad4a2a677
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Wed Dec 3 04:24:14 2008 +0000
+
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/StatusBarProvider.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/PictureBoxProvider.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/Button/InvokeProviderBehavior.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/CheckBox/ToggleProviderBehavior.cs:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms.Behaviors/RadioButton/SelectionItemProviderBehavior.cs:
+      Update IEmbeddedImage implementation.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/Helper.cs:
+      Rename GetBoundingRectangleFromButtonBase to GetButtonBaseImageBounds
+      to be more descriptive.
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/Image.cs:
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/Button.cs: Handle updates to
+      IEmbeddedImage.
+    
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/TextLabel.cs:
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/AutomationBridge.cs: If a label's
+      parent is a StatusBar, use the TextImageLabel adapter that implements
+      Atk.Image.  Fixes bug #448074.
+    
+    * uia2atk/UIAutomation/UIAutomationBridge/Mono.UIAutomation.Bridge/IEmbeddedImage.cs:
+      Rename BoundingRectangle to Bounds, and add HasImage and Description
+      properties.
+    
+    svn path=/trunk/uia2atk/; revision=120571
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    5 +++++
+ .../Mono.UIAutomation.Bridge/IEmbeddedImage.cs     |    6 +++++-
+ 2 files changed, 10 insertions(+), 1 deletions(-)
+
+commit c46af0d6dd19fc5318945ed1614d5659c0d71554
+Author: Mike Gorse <mgorse at mono-cvs.ximian.com>
+Date:   Tue Dec 2 00:16:51 2008 +0000
+
+    Set a NumericUpDown control's text immediately when editing with
+    EditableText.
+    Only set Editable state on a spinner if the control is not ReadOnly.
+    
+    svn path=/trunk/uia2atk/; revision=120422
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    5 +++
+ UIAutomation/UIAutomationBridge/Makefile.am        |    1 +
+ .../Mono.UIAutomation.Bridge/IEditableRange.cs     |   37 ++++++++++++++++++++
+ .../UIAutomationBridge/UIAutomationBridge.mdp      |    3 +-
+ 4 files changed, 45 insertions(+), 1 deletions(-)
+
+commit 30bc10d12dfd6ff6e8b58c05f8c7f3aa675f3eda
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Tue Nov 25 21:59:03 2008 +0000
+
+    2008-11-25  Brad Taylor  <brad at getcoded.net>
+    
+    	* UiaAtkBridge/Makefile.include:
+    	* UIAutomation/Makefile.include:
+    	* UIAutomationWinforms/Makefile.include: Correct path for 64-bit
+    	systems.
+    
+    
+    svn path=/trunk/uia2atk/; revision=120012
+
+ UIAutomation/ChangeLog        |    4 ++++
+ UIAutomation/Makefile.include |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletions(-)
+
+commit 3f8b21704b759cd78950be8f00dfcd87faf6b2e5
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Tue Nov 25 15:22:55 2008 +0000
+
+    2008-11-25  Brad Taylor  <brad at getcoded.net>
+    
+    	* UiaAtkBridge/UiaAtkBridge/Makefile.am:
+    	* UiaAtkBridge/Test/GailTest/Makefile.am:
+    	* UiaAtkBridge/Test/GailTestApp/Makefile.am:
+    	* UiaAtkBridge/Test/UiaAtkBridgeTest/Makefile.am:
+    	* UIAutomationWinforms/UIAutomationWinforms/Makefile.am:
+    	* UIAutomationWinforms/UIAutomationWinformsTests/Makefile.am: Use
+    	$(MONO_UIA_LIBS) instead of hardcoding paths.
+    
+    	* UiaAtkBridge/Test/AtkTest/Makefile.am: Clean up references.
+    
+    	* UiaAtkBridge/UiaAtkBridge/UiaAtkBridge.dll.config.in: Revert
+    	incorrect path change.
+    
+    	* UIAutomation/data/mono-uia.pc.in.in: Add UIAutomationClient to the
+    	Libs directive.
+    
+    
+    svn path=/trunk/uia2atk/; revision=119957
+
+ UIAutomation/ChangeLog              |    4 ++++
+ UIAutomation/data/mono-uia.pc.in.in |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletions(-)
+
+commit 4331d19dee785c823477a3fde462c22b6b54b7da
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Mon Nov 24 17:58:18 2008 +0000
+
+    * uia2atk/UIAutomation/UIAutomationProvider/System.Windows.Automation.Provider/AutomationInteropProvider.cs:
+      Typo/compilation fix.
+    
+    svn path=/trunk/uia2atk/; revision=119823
+
+ UIAutomation/UIAutomationProvider/ChangeLog        |    5 +++++
+ .../AutomationInteropProvider.cs                   |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletions(-)
+
+commit 0872ada1baa4e95293d9cf2bc8457ed07529a071
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Mon Nov 24 17:19:30 2008 +0000
+
+    2008-11-12  Brad Taylor  <brad at getcoded.net>
+    
+    	* UiaAtkBridge/NEWS:
+    	* UIAutomation/NEWS:
+    	* UIAutomationWinforms/NEWS: Move NEWS file into each individual
+    	module.
+    
+    
+    svn path=/trunk/uia2atk/; revision=119820
+
+ UIAutomation/ChangeLog |    4 ++++
+ UIAutomation/NEWS      |    7 +++++++
+ 2 files changed, 11 insertions(+), 0 deletions(-)
+
+commit 9c85c81051f94462403725721736fb8c1041a6ac
+Merge: a927bab d0614e0
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Mon Nov 24 17:05:52 2008 +0000
+
+    Initial README.
+    
+    svn path=/trunk/uia2atk/; revision=119814
+
+commit 096f648a3200e9a695cbb88af43b260cd6284dd3
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Sat Nov 22 00:45:58 2008 +0000
+
+    * uia2atk/UIAutomationWinforms/configure.ac:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinformsTests/providertest.sh.in:
+      Remove unnecessary check for bridge libraries.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinformsTests/TestHelper.cs:
+      Instead of using reflection to blank out the bridge assembly name,
+      set the new MONO_UIA_BRIDGE env var to a bad value.
+    
+    * uia2atk/UIAutomation/UIAutomationProvider/System.Windows.Automation.Provider/AutomationInteropProvider.cs:
+      New MONO_UIA_BRIDGE environment variable lets user set assembly name
+      indicating what bridge should be loaded.  A bad value will cause null
+      to be returned; an empty or null value will cause the UiaAtkBridge
+      assembly to be loaded.
+    
+    svn path=/trunk/uia2atk/; revision=119690
+
+ UIAutomation/UIAutomationProvider/ChangeLog        |    8 ++++++++
+ .../AutomationInteropProvider.cs                   |   14 +++++++++-----
+ 2 files changed, 17 insertions(+), 5 deletions(-)
+
+commit 5c53535578ca3b44a1d9de3297fb731bd499443a
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Nov 21 22:58:27 2008 +0000
+
+    * uia2atk-0.9/UIAutomation/README: Whitespace fixes.
+    
+    * uia2atk-0.9/UiaAtkBridge/README:
+    * uia2atk-0.9/UIAutomationWinforms/README: Add READMEs for these
+      tarballs, containing package information and installation
+      instructions.
+    
+    svn path=/branches/uia2atk/0.9/; revision=119681
+
+ UIAutomation/ChangeLog |    4 ++++
+ UIAutomation/README    |    2 +-
+ 2 files changed, 5 insertions(+), 1 deletions(-)
+
+commit 486c2b43924ad08892ea019487daac3628e96ead
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Nov 21 22:02:00 2008 +0000
+
+    * uia2atk-0.9/UIAutomation/README: Adding README file with package info
+      and install instructions.
+    
+    svn path=/branches/uia2atk/0.9/; revision=119679
+
+ UIAutomation/ChangeLog |    4 +++
+ UIAutomation/README    |   58 ++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 62 insertions(+), 0 deletions(-)
+
+commit 1c4a7f69988f977d37c92fb6ae9fc238b3b0fbef
+Merge: d02600b 59edd69
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Nov 21 05:35:18 2008 +0000
+
+    * uia2atk/UIAutomation/COPYING:
+    * uia2atk/UiaAtkBridge/COPYING:
+    * uia2atk/UIAutomationWinforms/COPYING: Add to top-level of each
+      tarball.
+    
+    svn path=/trunk/uia2atk/; revision=119579
+
+commit 49c50ecbee9dcc58e55d733419025f95538043c1
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Tue Nov 18 23:17:30 2008 +0000
+
+    * uia2atk/UIAutomation/UIAutomationProvider/System.Windows.Automation.Provider/AutomationInteropProvider.cs:
+      Dump errors and exceptions to console when bridge fails to load for
+      whatever reason. Should help when troubleshooting bad
+      packages/installs. Users will only see this if they have at least a
+      partial UIA install (that's broken).
+    
+    svn path=/trunk/uia2atk/; revision=119245
+
+ UIAutomation/UIAutomationProvider/ChangeLog        |    8 +++++
+ .../AutomationInteropProvider.cs                   |   30 +++++++++++++------
+ 2 files changed, 28 insertions(+), 10 deletions(-)
+
+commit 11f021add7a78f5f28e6c38e973e8471508c7253
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Tue Nov 18 22:43:24 2008 +0000
+
+    * UIAutomation/UIAutomationTypes/UIAutomationTypes.mdp:
+    * UIAutomation/UIAutomationBridge/UIAutomationBridge.mdp:
+    * UIAutomation/UIAutomationTypes/UIAutomationTypesTests.mdp:
+    * UIAutomation/UIAutomationProvider/UIAutomationProvider.mdp:
+    * UIAutomation/UIAutomationProvider/UIAutomationProviderTests.mdp: Add
+      makefile integration.
+    
+    svn path=/trunk/uia2atk/; revision=119238
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    4 ++++
+ .../UIAutomationBridge/UIAutomationBridge.mdp      |    8 ++++----
+ UIAutomation/UIAutomationProvider/ChangeLog        |    5 +++++
+ .../UIAutomationProvider/UIAutomationProvider.mdp  |    8 ++++----
+ .../UIAutomationProviderTests.mdp                  |    8 ++++----
+ UIAutomation/UIAutomationTypes/ChangeLog           |    5 +++++
+ .../UIAutomationTypes/UIAutomationTypes.mdp        |    8 ++++----
+ .../UIAutomationTypes/UIAutomationTypesTests.mdp   |    8 ++++----
+ 8 files changed, 34 insertions(+), 20 deletions(-)
+
+commit d05d76818e770dda7b077b24f0762b47823f3ab9
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Tue Nov 18 00:17:03 2008 +0000
+
+    Changed lib to $(libdir)
+    
+    svn path=/trunk/uia2atk/; revision=119112
+
+ UIAutomation/data/Makefile.am |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 5ea3df924d2830d93e7ad735f3e876d7d9c87d1f
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Mon Nov 17 22:49:34 2008 +0000
+
+    Reverting change
+    
+    svn path=/trunk/uia2atk/; revision=119107
+
+ UIAutomation/data/Makefile.am |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 7a0097b8b9d2eb68f96a3be4ccacca2eda07dddf
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Mon Nov 17 22:33:20 2008 +0000
+
+    Updated $(prefix)/lib to $(libdir)/ for pkgconfig to handle 64bit
+    
+    svn path=/trunk/uia2atk/; revision=119103
+
+ UIAutomation/data/Makefile.am |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 4a4bfbf93cb72aed5d94d55158e610724d8f55e7
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Mon Nov 17 21:10:39 2008 +0000
+
+    Changed UIAutomation to mono-uia in configure.ac
+    
+    svn path=/trunk/uia2atk/; revision=119089
+
+ UIAutomation/configure.ac |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+commit f51e05f87eae0325feb1ff926f89242e6838dd8f
+Author: Mario Carrion <mario at carrion.mx>
+Date:   Mon Nov 17 15:31:34 2008 +0000
+
+    * uia2atk/UiaAtkBridge/UiaAtkBridge/AutomationBridge.cs:
+      IsAccessibilityEnabled implementation to verify if Accessibility is
+      turned on. Initialize calls new Monitor, not constructor. Terminate
+      implementation.
+    
+    * uia2atk/UIAutomation/UIAutomationBridge/Mono.UIAutomation.Bridge/IAutomationBridge.cs:
+      Property added: IsAccessibilityEnabled.
+    
+    * uia2atk/UIAutomation/UIAutomationProvider/System.Windows.Automation.Provider/AutomationInteropProvider.cs:
+      Verifying if accessibility is enabled before initializing bridge.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ErrorProviderListener.cs:
+      SWF = System.Windows.Forms. Initializing internal dictionary when
+      ClientsAreListening. Not using Helper.AddPrivateEvent.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/FormListener.cs:
+      Initializing internal dictionary when ClientsAreListening.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/HelpProviderListener.cs:
+      Initializing internal dictionary when ClientsAreListening. Not using
+      Helper.AddPrivateEvent.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinforms/Mono.UIAutomation.Winforms/ToolTipListener.cs:
+      Using AutomationInteropProvider.ClientsAreListening IAutomationBridge
+      implementation: IsAccessibilityEnabled, Initialize, Terminate.
+    
+    * uia2atk/UIAutomationWinforms/UIAutomationWinformsTests/MockBridge.cs:
+      IAutomationBridge implementation: IsAccessibilityEnabled, Initialize,
+      Terminate.
+    
+    svn path=/trunk/uia2atk/; revision=119034
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    5 +++++
+ .../Mono.UIAutomation.Bridge/IAutomationBridge.cs  |    6 ++++++
+ UIAutomation/UIAutomationProvider/ChangeLog        |    5 +++++
+ .../AutomationInteropProvider.cs                   |   10 ++++++++--
+ 4 files changed, 24 insertions(+), 2 deletions(-)
+
+commit 3cacbd7255d0ded218fd1e301f1498ee03f36bd7
+Author: Andrés G. Aragoneses <knocte at gmail.com>
+Date:   Wed Nov 12 21:42:06 2008 +0000
+
+    * uia2atk/UiaAtkBridge/samples/managed/FormTest/FormTest.mdp:
+    * uia2atk/UiaAtkBridge/samples/managed/atkSharpHelloWorld/atkSharpHelloWorld.mdp:
+      Flush.
+    
+    * uia2atk/UIAutomation/UIAutomation.mds: Revert previous dumb changes.
+    
+    svn path=/trunk/uia2atk/; revision=118656
+
+ UIAutomation/ChangeLog        |    4 ++++
+ UIAutomation/UIAutomation.mds |   23 ++++++++++++-----------
+ 2 files changed, 16 insertions(+), 11 deletions(-)
+
+commit 6f1b10c08ceed9922d645e9e41836a1f75aadcd1
+Author: Andrés G. Aragoneses <knocte at gmail.com>
+Date:   Wed Nov 12 20:29:23 2008 +0000
+
+    * uia2atk/UIAutomation/UIAutomationTypes/UIAutomationTypes.mdp:
+    * uia2atk/UIAutomation/UIAutomationBridge/UIAutomationBridge.mdp:
+    * uia2atk/UIAutomation/UIAutomationProvider/UIAutomationProvider.mdp:
+      AssemblyInfo files are autogenerated.
+    
+    svn path=/trunk/uia2atk/; revision=118639
+
+ UIAutomation/UIAutomationBridge/ChangeLog          |    4 ++++
+ .../UIAutomationBridge/UIAutomationBridge.mdp      |    1 -
+ UIAutomation/UIAutomationProvider/ChangeLog        |    4 ++++
+ .../UIAutomationProvider/UIAutomationProvider.mdp  |    1 -
+ UIAutomation/UIAutomationTypes/ChangeLog           |    4 ++++
+ .../UIAutomationTypes/UIAutomationTypes.mdp        |    1 -
+ 6 files changed, 12 insertions(+), 3 deletions(-)
+
+commit 8e4853e1d95070532f6c628c938a98b49e9a02b4
+Author: Andrés G. Aragoneses <knocte at gmail.com>
+Date:   Wed Nov 12 20:26:11 2008 +0000
+
+    * uia2atk/Uia2Atk.mds:
+    * uia2atk/UIAutomation/UIAutomation.mds:
+    * uia2atk/UIAutomation/UIAutomationTypes/UIAutomationTypes.mdp:
+    * uia2atk/UIAutomation/UIAutomationBridge/UIAutomationBridge.mdp:
+    * uia2atk/UIAutomation/UIAutomationProvider/UIAutomationProvider.mdp:
+    * uia2atk/UIAutomationWinforms/UIAutomationWinformsTests/UIAutomationWinformsTests.mdp:
+      Update for new locations.
+    
+    svn path=/trunk/uia2atk/; revision=118638
+
+ UIAutomation/ChangeLog                             |    4 +++
+ UIAutomation/UIAutomation.mds                      |   23 +++++++++----------
+ UIAutomation/UIAutomationBridge/ChangeLog          |    4 +++
+ .../UIAutomationBridge/UIAutomationBridge.mdp      |    5 ++-
+ UIAutomation/UIAutomationProvider/ChangeLog        |    4 +++
+ .../UIAutomationProvider/UIAutomationProvider.mdp  |    2 +-
+ UIAutomation/UIAutomationTypes/ChangeLog           |    4 +++
+ .../UIAutomationTypes/UIAutomationTypes.mdp        |    2 +-
+ 8 files changed, 32 insertions(+), 16 deletions(-)
+
+commit 14b5794b37fd43eb2bd671b3dcf99eea1ad8bb3e
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Mon Nov 10 22:49:59 2008 +0000
+
+    removed extra files from being installed
+    
+    svn path=/trunk/uia2atk/; revision=118431
+
+ UIAutomation/Makefile.include |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+commit b0b9988a95db89170e189560899eb2a34134c2f1
+Merge: 1509c56 015850e
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Mon Nov 10 22:28:10 2008 +0000
+
+    2008-11-10  Brad Taylor  <brad at getcoded.net>
+    
+    	* */: Make distcheck pass.
+    
+    
+    svn path=/trunk/uia2atk/; revision=118427
+
+commit 015850e2f89f5e5b6041d2404580349774a43494
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Mon Nov 10 21:57:10 2008 +0000
+
+    missed a change in configure.ac
+    
+    svn path=/trunk/uia2atk/; revision=118422
+
+ UIAutomation/configure.ac |    1 -
+ 1 files changed, 0 insertions(+), 1 deletions(-)
+
+commit 9470589b8e5e2b5bed8969edba204c726f58a8c1
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Mon Nov 10 21:56:21 2008 +0000
+
+    Fixing make distcheck
+    
+    svn path=/trunk/uia2atk/; revision=118421
+
+ .../UIAutomationBridge/Assembly/AssemblyInfo.cs    |    2 +-
+ UIAutomation/UIAutomationBridge/Makefile.am        |    2 +-
+ .../UIAutomationClient/Assembly/AssemblyInfo.cs    |    2 +-
+ UIAutomation/UIAutomationClient/Makefile.am        |    2 +-
+ .../UIAutomationProvider/Assembly/AssemblyInfo.cs  |    2 +-
+ UIAutomation/UIAutomationProvider/Makefile.am      |    2 +-
+ .../UIAutomationTypes/Assembly/AssemblyInfo.cs     |    2 +-
+ UIAutomation/UIAutomationTypes/Makefile.am         |    2 +-
+ UIAutomation/WindowsBase/Makefile.am               |    4 ++--
+ UIAutomation/configure.ac                          |    1 +
+ UIAutomation/data/Makefile.am                      |    4 ++--
+ 11 files changed, 13 insertions(+), 12 deletions(-)
+
+commit a49f46290ccf66e7a31cb8f7724e6aa59da47a6c
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Fri Nov 7 22:45:34 2008 +0000
+
+    Fixed make distcheck
+    
+    svn path=/trunk/uia2atk/; revision=118235
+
+ UIAutomation/data/Makefile.am |    9 +++++----
+ 1 files changed, 5 insertions(+), 4 deletions(-)
+
+commit 9c5e7790c28988a2aa9c40b0db21455f76542614
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Nov 7 21:04:29 2008 +0000
+
+    * UIAutomation/UIAutomationTypes/Makefile.am: Add -lib:../bin compiler
+      flag to get local WindowsBase assembly.
+    
+    * UIAutomation/WindowsBase/Makefile.am: Add "/package 2.0" gacutil flag
+      to create WindowsBase symlink in the correct location.
+    
+    svn path=/trunk/uia2atk/; revision=118216
+
+ UIAutomation/ChangeLog                     |    5 +++++
+ UIAutomation/UIAutomationTypes/ChangeLog   |    5 +++++
+ UIAutomation/UIAutomationTypes/Makefile.am |    2 +-
+ UIAutomation/WindowsBase/Makefile.am       |    2 +-
+ 4 files changed, 12 insertions(+), 2 deletions(-)
+
+commit 1a5ed117a39364f250a875f26697086e388ad69e
+Author: Brad Taylor <brad at getcoded.net>
+Date:   Fri Nov 7 20:54:59 2008 +0000
+
+    2008-11-07  Brad Taylor  <brad at getcoded.net>
+    
+    	* Makefile.am:
+    	* configure.ac:
+    	* WindowsBase/: Import a small portion of WindowsBase so that we can
+    	  build UIAutomation* independently of olive.
+    
+    
+    svn path=/trunk/uia2atk/; revision=118213
+
+ UIAutomation/ChangeLog                             |    7 +
+ UIAutomation/Makefile.am                           |    2 +-
+ UIAutomation/WindowsBase/Assembly/AssemblyInfo.cs  |   82 ++++
+ UIAutomation/WindowsBase/Makefile.am               |   62 +++
+ .../WindowsBase/System.Windows.Media/Matrix.cs     |  393 +++++++++++++++++
+ UIAutomation/WindowsBase/System.Windows/Point.cs   |  195 +++++++++
+ UIAutomation/WindowsBase/System.Windows/Rect.cs    |  441 ++++++++++++++++++++
+ UIAutomation/WindowsBase/System.Windows/Size.cs    |  157 +++++++
+ UIAutomation/WindowsBase/System.Windows/Vector.cs  |  255 +++++++++++
+ UIAutomation/configure.ac                          |    1 +
+ 10 files changed, 1594 insertions(+), 1 deletions(-)
+
+commit 69666e82d30f307bda28ce1b26c1e1f159c50d61
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Nov 7 17:58:01 2008 +0000
+
+    * UIAutomation/data/Makefile.am:
+    * UIAutomation/data/mono-uia.pc.in:
+    * UIAutomation/data/mono-uia.pc.in.in: Let configure stage take care of
+      replacing @VERSION at .
+    
+    * UIAutomation/Makefile.am:
+    * UIAutomation/configure.ac: Remove cruft.
+    
+    * UIAutomation/UIAutomationTypes/Makefile.am:
+    * UIAutomation/UIAutomationClient/Makefile.am:
+    * UIAutomation/UIAutomationBridge/Makefile.am:
+    * UIAutomation/UIAutomationProvider/Makefile.am: Remove cruft, use bin
+      instead of lib/Debug.
+    
+    svn path=/trunk/uia2atk/; revision=118201
+
+ UIAutomation/ChangeLog                        |   10 +++++++++
+ UIAutomation/Makefile.am                      |    4 ---
+ UIAutomation/UIAutomationBridge/ChangeLog     |    4 +++
+ UIAutomation/UIAutomationBridge/Makefile.am   |   26 +++-------------------
+ UIAutomation/UIAutomationClient/ChangeLog     |    4 +++
+ UIAutomation/UIAutomationClient/Makefile.am   |   26 +++-------------------
+ UIAutomation/UIAutomationProvider/ChangeLog   |    4 +++
+ UIAutomation/UIAutomationProvider/Makefile.am |   26 +++-------------------
+ UIAutomation/UIAutomationTypes/ChangeLog      |    4 +++
+ UIAutomation/UIAutomationTypes/Makefile.am    |   23 ++-----------------
+ UIAutomation/configure.ac                     |   28 +-----------------------
+ UIAutomation/data/Makefile.am                 |    4 +-
+ UIAutomation/data/mono-uia.pc.in              |    5 ----
+ UIAutomation/data/mono-uia.pc.in.in           |    5 ++++
+ 14 files changed, 50 insertions(+), 123 deletions(-)
+
+commit b1173dc90fae7a7dd6d9fe1c43ca6b7c4de3a6f8
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Nov 7 17:33:26 2008 +0000
+
+    * UIAutomation/Makefile.include: Support passing "/package
+      accessibility" argument to gacutil via PACKAGE_FLAG var.
+    
+    * UIAutomation/UIAutomationTypes/Makefile.am:
+    * UIAutomation/UIAutomationClient/Makefile.am:
+    * UIAutomation/UIAutomationBridge/Makefile.am:
+    * UIAutomation/UIAutomationProvider/Makefile.am: Set PACKAGE_FLAG
+      properly, fix some find/replace bugs.
+    
+    svn path=/trunk/uia2atk/; revision=118195
+
+ UIAutomation/ChangeLog                        |    5 +++++
+ UIAutomation/Makefile.include                 |    4 ++--
+ UIAutomation/UIAutomationBridge/ChangeLog     |    4 ++++
+ UIAutomation/UIAutomationBridge/Makefile.am   |    9 +++++----
+ UIAutomation/UIAutomationClient/ChangeLog     |    4 ++++
+ UIAutomation/UIAutomationClient/Makefile.am   |    9 +++++----
+ UIAutomation/UIAutomationProvider/ChangeLog   |    4 ++++
+ UIAutomation/UIAutomationProvider/Makefile.am |    9 +++++----
+ UIAutomation/UIAutomationTypes/ChangeLog      |    4 ++++
+ UIAutomation/UIAutomationTypes/Makefile.am    |    9 +++++----
+ 10 files changed, 43 insertions(+), 18 deletions(-)
+
+commit 92d3e0b8c021b935d0bea00582d237f07a2d949e
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Nov 7 16:55:41 2008 +0000
+
+    * UIAutomation/configure.ac: Check for sn.
+    
+    svn path=/trunk/uia2atk/; revision=118191
+
+ UIAutomation/ChangeLog    |    4 ++++
+ UIAutomation/configure.ac |    5 +++++
+ 2 files changed, 9 insertions(+), 0 deletions(-)
+
+commit f0604041d6ebe043c6d003eca5ff67f57d7e8d6b
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Nov 7 16:35:54 2008 +0000
+
+    * UIAutomation/mkinstalldirs: Copy from olive.
+    
+    * UIAutomation/data/Makefile.am: Copy stuff from olive/build/rules.make
+      needed by this makefile.  Could use some cleanup of relative paths,
+      names, etc.
+    
+    * UIAutomation/UIAutomationTypes/Makefile.am:
+    * UIAutomation/UIAutomationClient/Makefile.am:
+    * UIAutomation/UIAutomationBridge/Makefile.am:
+    * UIAutomation/UIAutomationProvider/Makefile.am: After compiling, sign.
+      Should be cleaned up a bit.
+    
+    svn path=/trunk/uia2atk/; revision=118187
+
+ UIAutomation/ChangeLog                        |    7 ++
+ UIAutomation/UIAutomationBridge/ChangeLog     |    4 +
+ UIAutomation/UIAutomationBridge/Makefile.am   |    1 +
+ UIAutomation/UIAutomationClient/ChangeLog     |    4 +
+ UIAutomation/UIAutomationClient/Makefile.am   |    1 +
+ UIAutomation/UIAutomationProvider/ChangeLog   |    4 +
+ UIAutomation/UIAutomationProvider/Makefile.am |    1 +
+ UIAutomation/UIAutomationTypes/ChangeLog      |    4 +
+ UIAutomation/UIAutomationTypes/Makefile.am    |    1 +
+ UIAutomation/data/Makefile.am                 |   10 ++-
+ UIAutomation/mkinstalldirs                    |   99 +++++++++++++++++++++++++
+ 11 files changed, 135 insertions(+), 1 deletions(-)
+
+commit 1af7b82b79dae6a90e95d9f319e68e895f26ea5b
+Merge: 1046bbe a3f10c4
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Nov 7 15:54:56 2008 +0000
+
+    * UIAutomation/data/Makefile:
+    * UIAutomation/data/Makefile.am: Rename to Makefile.am, make it start to
+      work.
+    
+    * UIAutomation/Makefile.am: Add winfx3.pub to EXTRA_DIST.
+    
+    * UIAutomation/configure.ac: Re-add data/Makefile.
+    
+    * UIAutomation/build/common/Consts.cs.in: Don't need MonoVersion, afict.
+    
+    svn path=/trunk/uia2atk/; revision=118183
+
+commit e9414f53f7c4392ae88da28cbd6ebaba867a39f6
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Nov 7 15:06:52 2008 +0000
+
+    * UIAutomation/winfx3.pub: Add key for signing these assemblies, copied
+      from olive.
+    
+    * UIAutomation/UIAutomationTypes/Makefile.am:
+    * UIAutomation/UIAutomationClient/Makefile.am:
+    * UIAutomation/UIAutomationBridge/Makefile.am:
+    * UIAutomation/UIAutomationProvider/Makefile.am: Handle keysigning in
+      AssemblyInfo.cs, define NET_2_0 when compiling.
+    
+    * UIAutomation/configure.ac: Remove data for now, not done fixing this.
+      Add buil/common/Consts.cs (still need to set MONO_VERSION).
+    
+    * UIAutomation/configure:
+    * UIAutomation/build/common/MonoVersion.cs:
+    * UIAutomation/build/common/TestConfiguration.cs: Remove unneeded files.
+    
+    * UIAutomation/data/ChangeLog:
+    * UIAutomation/build/common/ChangeLog: Removed excessive ChangeLogs.
+    
+    svn path=/trunk/uia2atk/; revision=118179
+
+ UIAutomation/ChangeLog                         |   14 +
+ UIAutomation/UIAutomationBridge/ChangeLog      |    5 +
+ UIAutomation/UIAutomationBridge/Makefile.am    |    2 +-
+ UIAutomation/UIAutomationClient/ChangeLog      |    5 +
+ UIAutomation/UIAutomationClient/Makefile.am    |    2 +-
+ UIAutomation/UIAutomationProvider/ChangeLog    |    5 +
+ UIAutomation/UIAutomationProvider/Makefile.am  |    2 +-
+ UIAutomation/UIAutomationTypes/ChangeLog       |    5 +
+ UIAutomation/UIAutomationTypes/Makefile.am     |    2 +-
+ UIAutomation/build/common/ChangeLog            |   19 -
+ UIAutomation/build/common/MonoVersion.cs       |    6 -
+ UIAutomation/build/common/TestConfiguration.cs |   46 -
+ UIAutomation/configure                         | 4256 ------------------------
+ UIAutomation/configure.ac                      |    2 +-
+ UIAutomation/data/ChangeLog                    |   57 -
+ UIAutomation/winfx3.pub                        |  Bin 0 -> 160 bytes
+ 16 files changed, 39 insertions(+), 4389 deletions(-)
+
+commit 5bfe423f66010d413bd40f325e2d5ec302333f1d
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Fri Nov 7 05:04:29 2008 +0000
+
+    More build updates
+    
+    svn path=/trunk/uia2atk/; revision=118168
+
+ UIAutomation/UIAutomationBridge/Makefile.am    |    2 +
+ UIAutomation/UIAutomationClient/Makefile.am    |    2 +
+ UIAutomation/UIAutomationProvider/Makefile.am  |    2 +
+ UIAutomation/UIAutomationTypes/Makefile.am     |    2 +
+ UIAutomation/build/common/ChangeLog            |   19 ++++
+ UIAutomation/build/common/Consts.cs.in         |  119 +++++++++++++++++++++++
+ UIAutomation/build/common/Locale.cs            |   51 ++++++++++
+ UIAutomation/build/common/MonoTODOAttribute.cs |  120 ++++++++++++++++++++++++
+ UIAutomation/build/common/MonoVersion.cs       |    6 +
+ UIAutomation/build/common/TestConfiguration.cs |   46 +++++++++
+ UIAutomation/configure                         |    3 +-
+ UIAutomation/data/Makefile                     |    4 +-
+ 12 files changed, 373 insertions(+), 3 deletions(-)
+
+commit 8130991c9b3fcf917aeb9a8d39e22a0612d24218
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Fri Nov 7 02:04:05 2008 +0000
+
+    Fixed mono-uia.pc file
+    
+    svn path=/trunk/uia2atk/; revision=118165
+
+ UIAutomation/Makefile.am   |    4 ++--
+ UIAutomation/configure.ac  |    1 +
+ UIAutomation/data/Makefile |   11 +----------
+ 3 files changed, 4 insertions(+), 12 deletions(-)
+
+commit c338ead424cdcadef2b31dcd0cc2417892ae0ba1
+Author: Sandy Armstrong <sanfordarmstrong at gmail.com>
+Date:   Fri Nov 7 01:59:25 2008 +0000
+
+    * UIAutomation/UIAutomation.mds:
+    * UIAutomation/UIAutomationProvider/UIAutomation.mds: Move top-level
+      solution to top-level.
+    
+    svn path=/trunk/uia2atk/; revision=118164
+
+ UIAutomation/ChangeLog                             |    4 +++
+ UIAutomation/UIAutomation.mds                      |   25 ++++++++++++++++++++
+ UIAutomation/UIAutomationProvider/ChangeLog        |    4 +++
+ UIAutomation/UIAutomationProvider/UIAutomation.mds |   25 --------------------
+ 4 files changed, 33 insertions(+), 25 deletions(-)
+
+commit 8129e33cf705ea5037ac69ed1f1255c8dd4f89a2
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Fri Nov 7 01:52:51 2008 +0000
+
+    second commit to get build working
+    
+    svn path=/trunk/uia2atk/; revision=118163
+
+ UIAutomation/Makefile                         |  150 -
+ UIAutomation/Makefile.am                      |    6 +-
+ UIAutomation/UIAutomationBridge/Makefile      |    9 -
+ UIAutomation/UIAutomationBridge/Makefile.am   |   76 +
+ UIAutomation/UIAutomationClient/Makefile      |   10 -
+ UIAutomation/UIAutomationClient/Makefile.am   |   82 +
+ UIAutomation/UIAutomationProvider/Makefile    |   10 -
+ UIAutomation/UIAutomationProvider/Makefile.am |  101 +
+ UIAutomation/UIAutomationTypes/Makefile       |   10 -
+ UIAutomation/UIAutomationTypes/Makefile.am    |  128 +
+ UIAutomation/configure                        | 4292 ++++++++++++++++++++++++-
+ UIAutomation/configure.ac                     |    5 +-
+ 12 files changed, 4641 insertions(+), 238 deletions(-)
+
+commit 31498a809f809341cea6a65299347dfd95dc61b8
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Thu Nov 6 19:15:34 2008 +0000
+
+    First move at getting build put back together
+    
+    svn path=/trunk/uia2atk/; revision=118142
+
+ UIAutomation/Makefile                      |   30 +++++++-
+ UIAutomation/Makefile.am                   |    8 ++
+ UIAutomation/Makefile.include              |  116 ++++++++++++++++++++++++++++
+ UIAutomation/MakefileClass                 |   35 --------
+ UIAutomation/UIAutomationBridge/Makefile   |    6 +-
+ UIAutomation/UIAutomationClient/Makefile   |    6 +-
+ UIAutomation/UIAutomationProvider/Makefile |    6 +-
+ UIAutomation/UIAutomationTypes/Makefile    |    6 +-
+ UIAutomation/autogen.sh                    |   83 ++++++++++++++++++++
+ UIAutomation/configure.ac                  |  100 ++++++++++++++++++++++++
+ UIAutomation/data/ChangeLog                |   57 ++++++++++++++
+ UIAutomation/expansions.m4                 |   50 ++++++++++++
+ 12 files changed, 455 insertions(+), 48 deletions(-)
+
+commit 4568cc7538e8bdac1fdf4e06186712054f925b59
+Merge: 79e5301 b285d3f
+Author: Stephen Shaw <sshaw at decriptor.com>
+Date:   Thu Nov 6 18:48:35 2008 +0000
+
+    checkin the uia stuff from olive -> uia2atk
+    
+    svn path=/trunk/uia2atk/; revision=118135
diff --git a/Makefile.am b/Makefile.am
index ec5a1de..8bd4c1a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3,4 +3,28 @@ EXTRA_DIST = \
 	mono.snk \
 	winfx3.pub
 
-SUBDIRS =  WindowsBase UIAutomationTypes UIAutomationBridge UIAutomationProvider UIAutomationClient data
+if HAS_MONO_2_5
+ CODE_SUBDIRS = UIAutomationTypes UIAutomationBridge UIAutomationProvider UIAutomationSource UIAutomationClient
+else
+ CODE_SUBDIRS = WindowsBase UIAutomationTypes UIAutomationBridge UIAutomationProvider UIAutomationSource UIAutomationClient
+endif
+
+if ENABLE_TESTS
+ SUBDIRS = $(CODE_SUBDIRS) UIAutomationClientTests data
+else
+ SUBDIRS = $(CODE_SUBDIRS) data
+endif
+
+dist-hook:
+	@if test -d "$(srcdir)/../.git"; \
+	then \
+		echo Creating ChangeLog && \
+		( cd "$(top_srcdir)" && \
+		  echo '# Generated by Makefile. Do not edit.'; echo; \
+		  $(top_srcdir)/missing --run git log --stat . ) > ChangeLog.tmp \
+		&& mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \
+		|| ( rm -f ChangeLog.tmp ; \
+		     echo Failed to generate ChangeLog >&2 ); \
+	else \
+		echo A git clone is required to generate a ChangeLog >&2; \
+	fi
diff --git a/Makefile.in b/Makefile.in
index 895308b..8fad54e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -32,8 +34,8 @@ POST_UNINSTALL = :
 subdir = .
 DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in $(top_srcdir)/build/common/Consts.cs.in \
-	$(top_srcdir)/configure COPYING ChangeLog NEWS install-sh \
-	missing mkinstalldirs
+	$(top_srcdir)/configure COPYING NEWS install-sh missing \
+	mkinstalldirs
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/expansions.m4 \
 	$(top_srcdir)/configure.ac
@@ -43,6 +45,7 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_CLEAN_FILES = build/common/Consts.cs
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -54,16 +57,46 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir dist dist-all distcheck
 ETAGS = etags
 CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
+DIST_SUBDIRS = WindowsBase UIAutomationTypes UIAutomationBridge \
+	UIAutomationProvider UIAutomationSource UIAutomationClient \
+	data UIAutomationClientTests
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
 am__remove_distdir = \
-  { test ! -d $(distdir) \
-    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr $(distdir); }; }
+  { test ! -d "$(distdir)" \
+    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr "$(distdir)"; }; }
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 DIST_ARCHIVES = $(distdir).tar.gz
 GZIP_ENV = --best
 distuninstallcheck_listfiles = find . -type f -print
@@ -80,7 +113,11 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 GACUTIL = @GACUTIL@
+GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@
+GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@
 GMCS = @GMCS@
+GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@
+GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -110,6 +147,7 @@ SHELL = @SHELL@
 SN = @SN@
 STRIP = @STRIP@
 VERSION = @VERSION@
+WINDOWSBASE_LIBS = @WINDOWSBASE_LIBS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
@@ -157,7 +195,10 @@ EXTRA_DIST = \
 	mono.snk \
 	winfx3.pub
 
-SUBDIRS = WindowsBase UIAutomationTypes UIAutomationBridge UIAutomationProvider UIAutomationClient data
+ at HAS_MONO_2_5_FALSE@CODE_SUBDIRS = WindowsBase UIAutomationTypes UIAutomationBridge UIAutomationProvider UIAutomationSource UIAutomationClient
+ at HAS_MONO_2_5_TRUE@CODE_SUBDIRS = UIAutomationTypes UIAutomationBridge UIAutomationProvider UIAutomationSource UIAutomationClient
+ at ENABLE_TESTS_FALSE@SUBDIRS = $(CODE_SUBDIRS) data
+ at ENABLE_TESTS_TRUE@SUBDIRS = $(CODE_SUBDIRS) UIAutomationClientTests data
 all: all-recursive
 
 .SUFFIXES:
@@ -167,15 +208,15 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
-	      cd $(srcdir) && $(AUTOMAKE) --foreign  \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
 		&& exit 0; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -191,9 +232,10 @@ $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENC
 	$(SHELL) ./config.status --recheck
 
 $(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(srcdir) && $(AUTOCONF)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
 build/common/Consts.cs: $(top_builddir)/config.status $(top_srcdir)/build/common/Consts.cs.in
 	cd $(top_builddir) && $(SHELL) ./config.status $@
 
@@ -221,7 +263,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -255,16 +297,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -272,14 +314,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -291,7 +333,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -300,36 +342,41 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
 	$(am__remove_distdir)
-	test -d $(distdir) || mkdir $(distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
 	list='$(DISTFILES)'; \
@@ -345,38 +392,57 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
 	done
-	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
 	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
 	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
 	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r $(distdir)
+	|| chmod -R a+r "$(distdir)"
 dist-gzip: distdir
 	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
 	$(am__remove_distdir)
@@ -389,6 +455,10 @@ dist-lzma: distdir
 	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
 	$(am__remove_distdir)
 
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+	$(am__remove_distdir)
+
 dist-tarZ: distdir
 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
 	$(am__remove_distdir)
@@ -417,6 +487,8 @@ distcheck: dist
 	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
 	*.tar.lzma*) \
 	  unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
 	*.tar.Z*) \
 	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
 	*.shar.gz*) \
@@ -428,9 +500,11 @@ distcheck: dist
 	mkdir $(distdir)/_build
 	mkdir $(distdir)/_inst
 	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
 	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
 	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && cd $(distdir)/_build \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
 	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
 	    $(DISTCHECK_CONFIGURE_FLAGS) \
 	  && $(MAKE) $(AM_MAKEFLAGS) \
@@ -452,13 +526,15 @@ distcheck: dist
 	  && rm -rf "$$dc_destdir" \
 	  && $(MAKE) $(AM_MAKEFLAGS) dist \
 	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
 	$(am__remove_distdir)
 	@(echo "$(distdir) archives ready for distribution: "; \
 	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
 	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
 distuninstallcheck:
-	@cd $(distuninstallcheck_dir) \
+	@$(am__cd) '$(distuninstallcheck_dir)' \
 	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
 	   || { echo "ERROR: files left after uninstall:" ; \
 	        if test -n "$(DESTDIR)"; then \
@@ -500,6 +576,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -519,6 +596,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -527,18 +606,28 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
@@ -561,23 +650,38 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
 	all all-am am--refresh check check-am clean clean-generic \
 	ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
-	dist-lzma dist-shar dist-tarZ dist-zip distcheck distclean \
-	distclean-generic distclean-tags distcleancheck distdir \
-	distuninstallcheck dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
-	tags-recursive uninstall uninstall-am
+	dist-hook dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
+	distcheck distclean distclean-generic distclean-tags \
+	distcleancheck distdir distuninstallcheck dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am tags tags-recursive uninstall uninstall-am
+
+
+dist-hook:
+	@if test -d "$(srcdir)/../.git"; \
+	then \
+		echo Creating ChangeLog && \
+		( cd "$(top_srcdir)" && \
+		  echo '# Generated by Makefile. Do not edit.'; echo; \
+		  $(top_srcdir)/missing --run git log --stat . ) > ChangeLog.tmp \
+		&& mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \
+		|| ( rm -f ChangeLog.tmp ; \
+		     echo Failed to generate ChangeLog >&2 ); \
+	else \
+		echo A git clone is required to generate a ChangeLog >&2; \
+	fi
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/NEWS b/NEWS
index cc43bf1..9ded623 100644
--- a/NEWS
+++ b/NEWS
@@ -1,10 +1,187 @@
 
 Mono Accessibility News
 
-Copyright (C) 2008 Novell, Inc. (http://www.novell.com)
+Copyright (C) 2008 - 2010 Novell, Inc. (http://www.novell.com)
 
-Version 1.0: The "Leela" release
-* First stable release
+Version 2.1: The "Zoidberg" release
+* #628639 - Fedora: The control can't be found by using FindFirst(app, TreeScope.Descendants, condition) method
+* #624236 - Fail to launch KeePass.exe
+* #625814 - Segmentation fault in Fedora12 when the application have toolbarbutton control
+* #623809 - The at-spi2 will hang up the new launched dialog
+* #628639 - Fedora: The control can't be found by using FindFirst(app, TreeScope.Descendants, condition) method
+* #628996 - Fedora: The pattern of slider is not implemented yet.
+* #625814 - Segmentation fault in Fedora12 when the application have toolbarbutton control
+
+Version 2.0.95: The "occulture" release
+* #582891 - [Caching] Add unit tests for caching each property and pattern
+* #626521 - Winforms fails be accessible with at-spi-dbus enabled in 28-Jul-2010 version
+
+Version 2.0.94: The "nit" release
+* #574269 - Cannot find pane control on Linux
+* #574242 - Can't define custom provider by using the WM_GETOBJECT message
+* #582884 - [Caching] Test and implement behavior of AutomationElements passed to event handlers which were
+            signed up while there was an active CacheRequest
+* #582887 - [Caching] Test TreeWalker caching with more restrictive TreeFilter/TreeScope
+* #582888 - [Caching] Test caching as it relates to TextPattern
+* #617867 - press key make openfiledialog and savefiledialog died
+
+Version 2.0.93: The "machinima" release
+* #585147 - Initial work started
+
+Version 2.0.92: The "liger" release
+* #599589 - [uiaclient-GTKs]:the tree item can't be found by UIA Client
+* #590768 - The popup window is in the same tree level with its main window
+* #551109 - Support TextPatern.SupportedTextSelection
+
+Version 2.0.91: The "knowledgebase" release
+* #593283 - Find Silverlight child via UIAClientApi cause firefox crashed
+* #597216 - Moonlight HyperLink is missing Invoke Pattern
+
+Version 2.0.90: The "jabberwocky" release
+* #600024 - Weird problems in Gtk app when using managed AT to detect it
+* #600049 - ListView_details: navigate treetable's children in accerciser crash the application
+* #571577 - [uiaclient-Winforms]: the Openfiledialog's itemViewList.GetSupportedViews() method can't be shown as expected
+* #585111 - MoonlightAtkBridge 2.0 release test
+* #597333 - UiaAtkBridge Currently is failing make distcheck
+* #580447 - [UIAClient-Winforms] The viewId is difference between on Linux and Windows
+* #567496 - [uiaclient-winforms]The AutomationElement can't be found under OpenSuse 11.1
+* #515457 - CheckedListBox: treetable remain 'focused' state after focus is moved
+* #590708 - Fail to run IronPython Winforms application after install at-spi2
+* #593272 - Accerciser crash when Refrash Node using at-spi2
+* #596801 - [uiaclient-GTKs]: The disable button became a enable button, but its IsEnableProperty still be false
+* #598010 - [uiaclient-GTKs]: The control on the menubar should be recognized as menu item not menu.
+* #599140 - [uiaclient-GTKs]: check menu item is translated into Custom
+* #599598 - [uiaclient-GTKs]:The tree control should not support the Grid pattern
+* #600816 - [uiaclient-GTKs]:The menubar should not support SelectionPattern
+* #602254 - [uiaclient-GTKs]:Chcke Box control should not support InvokePattern
+* #602294 - [uiaclient-GTKs]:The CheckBox has not implemented IsContentElementProperty
+* #602296 - [uiaclient-GTKs]:The CheckBox has not implemented IsControlElementProperty
+* #576050 - [uiaclient-winforms]: The splitbutton's Invoke method doesn't work
+* #598053 - [uiaclient-GTKs]: The enable button's IsEnabledProperty is false
+* #598803 - [uiaclient-GTKs]:the menu item who can pop up the sub menu is recognized as menu
+* #600803 - [uiaclient-GTKs]:The Document has not implemented IsContentElementProperty
+* #600805 - [uiaclient-GTKs]:The Document has not implemented IsControlElementProperty
+* #602716 - [uiaclient-GTKs]:The ComboBox's IsContentElementProperty should be true
+* #602721 - [uiaclient-GTKs]:The ComboBox's IsControlElementProperty should be true
+* #575995 - [UIAexplore]: When call Invoke method twice, the UIAexplore will crash
+* #598030 - [uiaclient-GTKs]:For all the GTK controls, there is an extra TextPattern
+* #598036 - [uiaclient-GTKs]: The separator should not support any pattern
+
+Version 2.0.3: The "infotainment" release
+* #590765 - GridSpliter: Crash When Selected
+* #590708 - Fail to run IronPython Winforms application after install at-spi2
+* #586360 - Ironpython sample doesn't accessible after install at-spi1 and at-spi2
+* #596801 - [uiaclient-GTKs]: The disable button became a enable button, but its IsEnableProperty still be false
+* #593973 - GTK sub window can not be refreshed
+* #592185 - Supported AutomationElement returns AutomationElement.NotSupported
+
+Version 2.0.2: The "heliport" release
+* #587792 - TabControl: select invisible label child make the application crashed
+* #563890 - GridSplitter: run with Orca couldn't use Up|Down Right|Left to move splitter
+* #587783 - TabControl: 'page tab' has 2 extraneous labels
+* #555165 - Couldn't show GridSplitter sample which is build by mxap
+* #546068 - Block bugs from moonlight
+* #494708 - Test DataGrid control
+* #588941 - Task of review ClientAPI-Gtk tests on dashboard-Ray
+* #588942 - Task of review ClientAPI-Gtk tests on dashboard-Neville
+* #571772 - In scrollable list, listitem[0] missing ScrollItemPattern 
+* #571786 - In non-scrollable list, listitems support extraneous ScrollItemPattern
+* #576450 - [uiaclient-winforms] The dialog's Window Pattern' WindowInteractionState will be different between Windows and Linux
+* #578244 - [uiaclient-winforms]: the datagrid's GetItem method can't be run on Linux
+
+Version 2.0.1: The "guesstimate" release
+* #579004 - Update google docs with new testcase descriptions
+* #554449 - ComboBox crashes when using ItemsSource
+* #576600 - Handle ControlType changes in bridges.
+* #494724 - Test TabControl control
+* #494709 - Test DatePicker control
+* #584340 - In ListView, Calling ValuePattern.SetValue on one cell can take effect on another sibling cell
+* #572683 - ElementNotAvailableException is not fired.
+* #558289 - Slider: Key Navigation Does Not Update Slider's Value with SmallChange Property
+* #586635 - The NameProperty of DataGridView's Cell is not correctly returned.
+
+Version 2.0: The "hypnotoad" release
+* #574269 - Cannot find pane control on Linux
+
+Version 1.9.90: The "fantabulous" release
+* #572097 - Test AutomationEvents.SelectionItem* events.
+* #567650 - DataGrid: view on accerciser left treeview make the app crash
+* #567651 - Calendar: week labels have extraneous 'selectable' state
+* #567653 - Calendar: title buttons have extraneous 'selectable' state
+* #561268 - TextBlock: Multi-line Name Is Parsed Incorrectly
+* #555714 - HyperlinkButton: do click action on accerciser make the firefox crashed
+* #576554 - Summary the client-UIA winforms test
+* #576557 - Test SetFocus
+* #489290 - Support properties other than ControlType.
+* #489272 - Implement DeviceEventController interface
+* #576665 - TabControl doesn't refresh children when changing tab.
+* #578220 - Run and add more test case for the current project.
+
+Version 1.8.94: The "ebonics" release
+* #551974 - [PENDING BACKPORT] Test CalendarAutomationPeer and related Peers.
+* #551977 - [PENDING BACKPORT] Test TabControlAutomationPeer and related Peers.
+* #550616 - Make the output log of each element more meaningful.
+* #571581 - Run UIA Client API winforms tests on Linux
+* #568774 - Fix thread safety issues in UiaDbusSource
+* #489315 - Implement TextPattern events
+* #572516 - Build the rpm package for at-spi2-0.14
+* #573328 - Figure out why after install the at-spi2 0.1.4, the test can't run
+* #572318 - Clean UIAutomationWinforms code to return LocalizedControlType
+* #562187 - TabControlAutomationPeer does not return children from GetChildren()
+* #560711 - Slider: some extraneous push buttons
+* #494712 - Test Image control
+* #494713 - Test ListBox control
+* #494714 - Test MediaElement control
+* #494715 - Test MultiScaleImage control
+* #494721 - Test ScrollViewer control
+* #494722 - Test Selector control
+* #494723 - Test Slider control
+* #494726 - Test Thumb control
+* #576537 - Finishing running UIA Client API winforms test case 103.
+* #576041 - Create automated test for Moonlight SL2WithPrism real sample
+* #489336 - Implement AutomationElement.FromPoint method
+* #576896 - Run Winforms client test case104 on Linux, other tests followup
+
+Version 1.8.93: The "digerati" release
+* #568599 - Dig and verify bug 567496
+* #568627 - [PENDING BACKPORT] IsOffscreen event not raised when Visibility changes
+* #568775 - Fix thread safety issues in UiaDbusBridge
+* #568776 - Make a light-weight uispy-like AT client
+* #567486 - Build atspiuiasource, at-spi-sharp, uiadbus debian package
+* #567919 - Rebuild mono-uia, mono-uia-atkbridge, mono-uia-winforms deb packages
+
+Version 1.8.92: The "chocoholic" release
+* #554449 - MoonAtkBridge doesn't display the proper accessibles when more than one plugin is loaded
+* #555714 - HyperlinkButton: do click action on accerciser make the firefox crashed
+* #549215 - Investigate and fix latest segfault in Bridge
+* #494719 - Test RepeatButton control
+* #494727 - Test ToggleButton control
+* #552190 - Make sure StructureChanged is raised
+* #553682 - Accerciser shows wrong elements for the first sample
+* #564737 - Update code according to the comments from Review Board.
+* #565859 - Prepare machines to be ready for running tests
+* #567486 - Build atspiuiasource, at-spi-sharp, uiadbus debian package
+* #567919 - Rebuild mono-uia, mono-uia-atkbridge, mono-uia-winforms deb packages
+
+Version 1.8.91: The "beefalo" release
+* #559133 - RadioButton: missing checked and focused states when doing click action
+* #558232 - ProgressBar: value shouldn't be editable
+* #494706 - Test CheckBox control
+* #494711 - Test HyperlinkButton control
+* #494717 - Test ProgressBar control
+* #494718 - Test RadioButton control
+* #494720 - Test ScrollBar control
+* #489331 - Implement AutomationFocusChangedEventArgs
+* #489386 - DbusCoreUiaSource: Implement AutomationElement.FocusedElement
+* #541418 - Security audit for InternalsVisibleTo and platform-code marking of MoonAtkBridge
+* #550443 - If user disables MoonAtkBridge extension from the Firefox->Addons menu, the extension is still enabled
+* #554577 - Write method according the keyboard() in strongwind.
+* #554784 - Replace Find* methods with more generic Find<>
+* #557628 - TreeWalker.directChildren shall be dynamic
+* #558394 - MoonAtkBridge build is broken due to Makefile issues in the tests
+* #555717 - HyperlinkButton: wrong action name
+* #559825 - ScrollBar: HScrollBar is missing 'horizontal' state and VScrollBar is missing 'vertical' state
+
+Version 1.8.90: The "anacronym" release
+* Initial release
 
-Version 0.9: The "Zoidberg" release
-* Initial Release
diff --git a/UIAutomationBridge/AssemblyInfo.cs b/UIAutomationBridge/AssemblyInfo.cs
index 159f4dd..2073fae 100644
--- a/UIAutomationBridge/AssemblyInfo.cs
+++ b/UIAutomationBridge/AssemblyInfo.cs
@@ -44,7 +44,7 @@ using System.Security.Permissions;
 [assembly: NeutralResourcesLanguage ("en")]
 [assembly: CLSCompliant (true)]
 [assembly: AssemblyDelaySign (true)]
-[assembly: AssemblyKeyFile ("/var/lib/hudson/jobs/UIAutomation_tag_1.0_tarball/workspace/UIAutomation/winfx3.pub")]
+[assembly: AssemblyKeyFile ("/var/lib/hudson/jobs/_uia_tag_tarballs/workspace/UIAutomation/winfx3.pub")]
 
 [assembly: ComVisible (false)]
 [assembly: AllowPartiallyTrustedCallers]
diff --git a/UIAutomationBridge/ChangeLog b/UIAutomationBridge/ChangeLog
deleted file mode 100644
index 5fdb7ee..0000000
--- a/UIAutomationBridge/ChangeLog
+++ /dev/null
@@ -1,158 +0,0 @@
-2009-03-12  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* Mono.UIAutomation.Services/Log.cs: Fix typo in string
-	formatting.
-
-2009-03-12  Brad Taylor  <brad at getcoded.net>
-
-	* Mono.UIAutomation.Services/Log.cs: Add log methods that allow
-	Exceptions to be dumped.
-
-2009-03-09  Mario Carrion  <mcarrion at novell.com>
-
-	* Makefile.am:
-	* UIAutomationBridge.mdp: IClipboardSupport, IEditableRange and IText
-	moved to UIAutomationProvider.
-
-	* Mono.UIAutomation.Bridge/IText.cs:
-	* Mono.UIAutomation.Bridge/IEditableRange.cs:
-	* Mono.UIAutomation.Bridge/IClipboardSupport.cs: Moved to
-	UIAutomationProvider.
-
-2009-02-20  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* UIAutomationBridge.mdp: Point projects at Makefile.am, not
-	Makefile.
-
-2009-02-05  Mario Carrion  <mcarrion at novell.com>
-
-	* UIAutomationBridge.mdp: Mono.UIAutomation.Services/Log.cs file
-	included in project.
-
-2009-02-05  Brad Taylor  <brad at getcoded.net>
-
-	* Makefile.am: 
-	* Mono.UIAutomation.Services: 
-	* Mono.UIAutomation.Services/Log.cs: Add new Log class.
-
-2009-01-27  Mike Gorse <mgorse at novell.com>
-
-	* Mono.UIAutomation.Bridge/IText.cs: Add GetSelection.
-
-2009-01-27  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* UIAutomationBridge.mdp: Update project files to match makefiles, since
-	there is no synchronization on these projects.
-
-2009-01-27  Brad Taylor  <brad at getcoded.net>
-
-	* Makefile.am: Rename IEmbeddedImage to IEmbeddedImageProvider and move
-	it to UIAutomationProvider.
-
-2009-01-22  Mario Carrion  <mcarrion at novell.com>
-
-	* UIAutomationBridge.mdp: IClipboardSupport.cs file added.
-
-2009-01-22  Brad Taylor  <brad at getcoded.net>
-
-	* Makefile.am: 
-	* Mono.UIAutomation.Bridge/IClipboardSupport.cs: 
-	Add an internal interface to allow us to perform clipboard operations
-	on UIA providers.
-
-2009-01-09  Mike Gorse <mgorse at novell.com>
-
-	* Makefile.am, Mono.UIAutomation.Bridge/IText.cs: Add IText.cs.
-
-2008-12-03  Mike Gorse <mgorse at novell.com>
-
-	* Mono.UIAutomation.Bridge/EditableRange.cs: Rework.
-
-2008-12-03  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* Mono.UIAutomation.Bridge/IEmbeddedImage.cs: Remove
-	IEmbeddedImage.HasImage property...just check Bounds.IsEmpty instead.
-
-2008-12-02  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* Mono.UIAutomation.Bridge/IEmbeddedImage.cs: Rename BoundingRectangle
-	to Bounds, and add HasImage and Description properties.
-
-2008-12-01  Mike Gorse <mgorse at novell.com>
-
-	* Makefile.am, UIAutomationBridge.mdp,
-	  Mono.UIAutomation.Bridge/EditableRange.cs: Add EditableRange.cs.
-
-2008-11-18  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* UIAutomationBridge.mdp: Add makefile integration.
-
-2008-11-17  Mario Carrion  <mcarrion at novell.com>
-
-	* Mono.UIAutomation.Bridge/IAutomationBridge.cs: Property added:
-	IsAccessibilityEnabled.
-
-2008-11-12  Andrés G. Aragoneses  <aaragoneses at novell.com>
-
-	* UIAutomationBridge.mdp: AssemblyInfo files are autogenerated.
-
-2008-11-12  Andrés G. Aragoneses  <aaragoneses at novell.com>
-
-	* UIAutomationBridge.mdp: Update for new locations.
-
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* Makefile.am: Remove cruft, use bin instead of lib/Debug.
-
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* Makefile.am: Set PACKAGE_FLAG properly, fix some find/replace bugs.
-
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* Makefile.am: After compiling, sign.  Should be cleaned up a bit.
-
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* Makefile.am: Handle keysigning in AssemblyInfo.cs, define NET_2_0 when
-	compiling.
-
-2008-10-07  Andrés G. Aragoneses <aaragoneses at novell.com> 
-
-	* UIAutomationBridge.mdp, Mono.UIAutomation.Bridge/IEmbeddedImage.cs,
-	  UIAutomationBridge.dll.sources, Mono.UIAutomation.Bridge/IImage.cs:
-	  Simplified name and API.
-
-2008-10-07  Andrés G. Aragoneses <aaragoneses at novell.com> 
-
-	* Mono.UIAutomation.Bridge/IImage.cs, UIAutomationBridge.mdp,
-	  UIAutomationBridge.dll.sources: Workaround for 4th item in
-	  http://www.mono-project.com/Accessibility:_Specification_Notes#Feature_requests
-	  .
-
-2008-10-01  Mike Gorse <mgorse at novell.com>
-
-	* Mono.UIAutomation.Bridge/IHypertext.cs: Added Enabled method.
-
-2008-09-29  Mario Carrion <mcarrion at novell.com> 
-
-	* UIAutomationBridge.mdp: File included in solution.
-
-2008-09-29  Mike Gorse <mgorse at novell.com>
-
-	* UIAutomationBridge.dll.sources,
-	  Mono.UIAutomation.Bridge/IHypertext.cs: Added
-	  Mono.UIAutomation.Bridge/IHypertext.cs.
-
-2008-07-29  Sandy Armstrong <sanfordarmstrong at gmail.com> 
-
-	* Makefile: Add to 'accessibility' package.
-
-2008-05-13  Sandy Armstrong <sanfordarmstrong at gmail.com> 
-
-	* Assembly, Assembly/AssemblyInfo.cs, Mono.UIAutomation.Bridge,
-	  Mono.UIAutomation.Bridge/IAutomationBridge.cs, ChangeLog,
-	  UIAutomationBridge.dll.sources, UIAutomationBridge.mdp,
-	  UIAutomationBridge.mds, Makefile: Moved IAutomationBridge interface
-	  to a new assembly, UIAutomationBridge.
-
diff --git a/UIAutomationBridge/Makefile.am b/UIAutomationBridge/Makefile.am
index f70a793..f7b768c 100644
--- a/UIAutomationBridge/Makefile.am
+++ b/UIAutomationBridge/Makefile.am
@@ -25,13 +25,16 @@ RESGEN=resgen2
 	
 all: $(ASSEMBLY) $(PROGRAMFILES)
 
-FILES =  \
-	AssemblyInfo.cs \
-	../build/common/*.cs \
+PROJECT_SOURCE_FILES =  \
 	Mono.UIAutomation.Bridge/IAutomationBridge.cs \
 	Mono.UIAutomation.Bridge/IHypertext.cs \
 	Mono.UIAutomation.Services/Log.cs
 
+FILES =  \
+        AssemblyInfo.cs \
+        ../build/common/*.cs \
+	$(PROJECT_SOURCE_FILES)
+
 DATA_FILES = 
 
 RESOURCES =
diff --git a/UIAutomationBridge/Makefile.in b/UIAutomationBridge/Makefile.in
index 85e1266..199ed18 100644
--- a/UIAutomationBridge/Makefile.in
+++ b/UIAutomationBridge/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -17,8 +18,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -32,7 +34,7 @@ NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
 DIST_COMMON = $(srcdir)/AssemblyInfo.cs.in $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(top_srcdir)/Makefile.include ChangeLog
+	$(srcdir)/Makefile.in $(top_srcdir)/Makefile.include
 subdir = UIAutomationBridge
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/expansions.m4 \
@@ -41,19 +43,33 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_CLEAN_FILES = AssemblyInfo.cs
-am__installdirs = "$(DESTDIR)$(bindir)" \
-	"$(DESTDIR)$(linuxpkgconfigdir)"
-binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-SCRIPTS = $(bin_SCRIPTS)
-SOURCES =
-DIST_SOURCES =
+CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-linuxpkgconfigDATA_INSTALL = $(INSTALL_DATA)
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(linuxpkgconfigdir)"
+SCRIPTS = $(bin_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
 DATA = $(linuxpkgconfig_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -68,7 +84,11 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 GACUTIL = @GACUTIL@
+GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@
+GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@
 GMCS = @GMCS@
+GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@
+GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -98,6 +118,7 @@ SHELL = @SHELL@
 SN = @SN@
 STRIP = @STRIP@
 VERSION = @VERSION@
+WINDOWSBASE_LIBS = @WINDOWSBASE_LIBS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
@@ -159,13 +180,16 @@ PROGRAMFILES = \
 	$(UIAUTOMATIONBRIDGE_DLL_MDB)  
 
 RESGEN = resgen2
-FILES = \
-	AssemblyInfo.cs \
-	../build/common/*.cs \
+PROJECT_SOURCE_FILES = \
 	Mono.UIAutomation.Bridge/IAutomationBridge.cs \
 	Mono.UIAutomation.Bridge/IHypertext.cs \
 	Mono.UIAutomation.Services/Log.cs
 
+FILES = \
+        AssemblyInfo.cs \
+        ../build/common/*.cs \
+	$(PROJECT_SOURCE_FILES)
+
 DATA_FILES = 
 RESOURCES = 
 REFERENCES = \
@@ -253,14 +277,14 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(a
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  UIAutomationBridge/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  UIAutomationBridge/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign UIAutomationBridge/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign UIAutomationBridge/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -278,44 +302,63 @@ $(top_srcdir)/configure:  $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 AssemblyInfo.cs: $(top_builddir)/config.status $(srcdir)/AssemblyInfo.cs.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 install-binSCRIPTS: $(bin_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	    $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-binSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
 install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(linuxpkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)"
-	@list='$(linuxpkgconfig_DATA)'; for p in $$list; do \
+	@list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(linuxpkgconfigDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(linuxpkgconfigdir)/$$f'"; \
-	  $(linuxpkgconfigDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(linuxpkgconfigdir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(linuxpkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \
 	done
 
 uninstall-linuxpkgconfigDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(linuxpkgconfig_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(linuxpkgconfigdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(linuxpkgconfigdir)/$$f"; \
-	done
+	@list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(linuxpkgconfigdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(linuxpkgconfigdir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -339,13 +382,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -377,6 +424,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -396,6 +444,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -404,18 +454,28 @@ install-data-am: install-data-local install-linuxpkgconfigDATA
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am: install-binSCRIPTS
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -500,6 +560,7 @@ $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafil
 	mkdir -p $(shell dirname $(ASSEMBLY))
 	$(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref)
 	sn -q -R $(ASSEMBLY) $(top_srcdir)/mono.snk
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/UIAutomationBridge/Mono.UIAutomation.Bridge/IAutomationBridge.cs b/UIAutomationBridge/Mono.UIAutomation.Bridge/IAutomationBridge.cs
index 9f7b701..573a404 100644
--- a/UIAutomationBridge/Mono.UIAutomation.Bridge/IAutomationBridge.cs
+++ b/UIAutomationBridge/Mono.UIAutomation.Bridge/IAutomationBridge.cs
@@ -35,7 +35,7 @@ namespace Mono.UIAutomation.Bridge
 		bool ClientsAreListening { get; }
 		
 		object HostProviderFromHandle (IntPtr hwnd);
-		
+
 		void RaiseAutomationEvent (AutomationEvent eventId,
 		                           object provider,
 		                           AutomationEventArgs e);
diff --git a/UIAutomationBridge/Mono.UIAutomation.Services/Log.cs b/UIAutomationBridge/Mono.UIAutomation.Services/Log.cs
index 2fe2835..c42c024 100644
--- a/UIAutomationBridge/Mono.UIAutomation.Services/Log.cs
+++ b/UIAutomationBridge/Mono.UIAutomation.Services/Log.cs
@@ -56,6 +56,8 @@ namespace Mono.UIAutomation.Services
 				} catch { }
 			}
 		}
+		
+		public static event Action<string> ErrorHappened;
 
 		public static void Info (string message)
 		{
@@ -111,30 +113,34 @@ namespace Mono.UIAutomation.Services
 #region Private Methods
 		private static void PrintMessage (LogLevel level, string message, object[] args)
 		{
-			if ((int)currentLogLevel > (int)level)
-				return;
-
 			// Code from Banshee under the MIT/X11 License
-			Console.Error.Write ("[{0} {1:00}:{2:00}:{3:00}.{4:000}] ",
-			                     GetLogLevelString (level),
-			                     DateTime.Now.Hour, DateTime.Now.Minute,
-			                     DateTime.Now.Second, DateTime.Now.Millisecond); 
-
+			string msg = String.Format ("[{0} {1:00}:{2:00}:{3:00}.{4:000}] ",
+			                            GetLogLevelString (level),
+			                            DateTime.Now.Hour, DateTime.Now.Minute,
+			                            DateTime.Now.Second, DateTime.Now.Millisecond);
+			
 			if (args == null)
-				Console.Error.WriteLine (message);
+				msg += message;
 			else
-				Console.Error.WriteLine (message, args);
+				msg += String.Format (message, args);
+			
+			if ((int)currentLogLevel <= (int)level)
+				Console.Error.WriteLine (msg);
+			
+			var handler = ErrorHappened;
+			if (handler != null && level == LogLevel.Error)
+				handler (msg);
 		}
 
 		private static string GetLogLevelString (LogLevel level)
 		{
 			switch (level) {
 			case LogLevel.Information:
-				return "Info ";
+				return "Info";
 			case LogLevel.Debug:
 				return "Debug";
 			case LogLevel.Warning:
-				return "Warn ";
+				return "Warn";
 			case LogLevel.Error:
 				return "Error";
 			}
diff --git a/UIAutomationClient/AssemblyInfo.cs b/UIAutomationClient/AssemblyInfo.cs
index 15b7cf7..c30e502 100644
--- a/UIAutomationClient/AssemblyInfo.cs
+++ b/UIAutomationClient/AssemblyInfo.cs
@@ -44,14 +44,15 @@ using System.Security.Permissions;
 [assembly: NeutralResourcesLanguage ("en")]
 [assembly: CLSCompliant (true)]
 [assembly: AssemblyDelaySign (true)]
-[assembly: AssemblyKeyFile ("/var/lib/hudson/jobs/UIAutomation_tag_1.0_tarball/workspace/UIAutomation/winfx3.pub")]
+[assembly: AssemblyKeyFile ("/var/lib/hudson/jobs/_uia_tag_tarballs/workspace/UIAutomation/winfx3.pub")]
 
 [assembly: ComVisible (false)]
-[assembly: AllowPartiallyTrustedCallers]
 
 [assembly: CompilationRelaxations (CompilationRelaxations.NoStringInterning)]
 [assembly: Debuggable (DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
 [assembly: RuntimeCompatibility (WrapNonExceptionThrows = true)]
 [assembly: PermissionSet (SecurityAction.RequestMinimum, Name = "FullTrust")]
+
+[assembly: InternalsVisibleTo ("UiaDbusSource, PublicKey=00240000048000009400000006020000002400005253413100040000110000004bb98b1af6c1df0df8c02c380e116b7a7f0c8c827aecfccddc6e29b7c754cd608b49dfcef4df9699ad182e50f66afa4e68dabc7b6aeeec0aa4719a5f8e0aae8c193080a706adc3443a8356b1f254142034995532ac176398e12a30f6a74a119a89ac47672c9ae24d7e90de686557166e3b873cd707884431a0451d9d6f7fe795")]
+[assembly: InternalsVisibleTo ("AtspiUiaSource, PublicKey=00240000048000009400000006020000002400005253413100040000110000004bb98b1af6c1df0df8c02c380e116b7a7f0c8c827aecfccddc6e29b7c754cd608b49dfcef4df9699ad182e50f66afa4e68dabc7b6aeeec0aa4719a5f8e0aae8c193080a706adc3443a8356b1f254142034995532ac176398e12a30f6a74a119a89ac47672c9ae24d7e90de686557166e3b873cd707884431a0451d9d6f7fe795")]
 [assembly: SecurityPermission (SecurityAction.RequestMinimum, SkipVerification = true)]
-[assembly: InternalsVisibleTo("UIAutomationWinforms, PublicKey=00240000048000009400000006020000002400005253413100040000110000004bb98b1af6c1df0df8c02c380e116b7a7f0c8c827aecfccddc6e29b7c754cd608b49dfcef4df9699ad182e50f66afa4e68dabc7b6aeeec0aa4719a5f8e0aae8c193080a706adc3443a8356b1f254142034995532ac176398e12a30f6a74a119a89ac47672c9ae24d7e90de686557166e3b873cd707884431a0451d9d6f7fe795")]
diff --git a/UIAutomationClient/AssemblyInfo.cs.in b/UIAutomationClient/AssemblyInfo.cs.in
index 5a47e2a..0223309 100644
--- a/UIAutomationClient/AssemblyInfo.cs.in
+++ b/UIAutomationClient/AssemblyInfo.cs.in
@@ -47,11 +47,12 @@ using System.Security.Permissions;
 [assembly: AssemblyKeyFile ("@abs_top_srcdir@/winfx3.pub")]
 
 [assembly: ComVisible (false)]
-[assembly: AllowPartiallyTrustedCallers]
 
 [assembly: CompilationRelaxations (CompilationRelaxations.NoStringInterning)]
 [assembly: Debuggable (DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
 [assembly: RuntimeCompatibility (WrapNonExceptionThrows = true)]
 [assembly: PermissionSet (SecurityAction.RequestMinimum, Name = "FullTrust")]
+
+[assembly: InternalsVisibleTo ("UiaDbusSource, PublicKey=00240000048000009400000006020000002400005253413100040000110000004bb98b1af6c1df0df8c02c380e116b7a7f0c8c827aecfccddc6e29b7c754cd608b49dfcef4df9699ad182e50f66afa4e68dabc7b6aeeec0aa4719a5f8e0aae8c193080a706adc3443a8356b1f254142034995532ac176398e12a30f6a74a119a89ac47672c9ae24d7e90de686557166e3b873cd707884431a0451d9d6f7fe795")]
+[assembly: InternalsVisibleTo ("AtspiUiaSource, PublicKey=00240000048000009400000006020000002400005253413100040000110000004bb98b1af6c1df0df8c02c380e116b7a7f0c8c827aecfccddc6e29b7c754cd608b49dfcef4df9699ad182e50f66afa4e68dabc7b6aeeec0aa4719a5f8e0aae8c193080a706adc3443a8356b1f254142034995532ac176398e12a30f6a74a119a89ac47672c9ae24d7e90de686557166e3b873cd707884431a0451d9d6f7fe795")]
 [assembly: SecurityPermission (SecurityAction.RequestMinimum, SkipVerification = true)]
-[assembly: InternalsVisibleTo("UIAutomationWinforms, PublicKey=00240000048000009400000006020000002400005253413100040000110000004bb98b1af6c1df0df8c02c380e116b7a7f0c8c827aecfccddc6e29b7c754cd608b49dfcef4df9699ad182e50f66afa4e68dabc7b6aeeec0aa4719a5f8e0aae8c193080a706adc3443a8356b1f254142034995532ac176398e12a30f6a74a119a89ac47672c9ae24d7e90de686557166e3b873cd707884431a0451d9d6f7fe795")]
diff --git a/UIAutomationClient/ChangeLog b/UIAutomationClient/ChangeLog
deleted file mode 100644
index e2b5a3c..0000000
--- a/UIAutomationClient/ChangeLog
+++ /dev/null
@@ -1,25 +0,0 @@
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* Makefile.am: Remove cruft, use bin instead of lib/Debug.
-
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* Makefile.am: Set PACKAGE_FLAG properly, fix some find/replace bugs.
-
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* Makefile.am: After compiling, sign.  Should be cleaned up a bit.
-
-2008-11-07  Sandy Armstrong  <sanfordarmstrong at gmail.com>
-
-	* Makefile.am: Handle keysigning in AssemblyInfo.cs, define NET_2_0 when
-	compiling.
-
-2008-10-24  Brad Taylor  <brad at getcoded.net>
-	
-	* System.Windows.Automation/TextPattern.cs: Implement attributes.
-
-2008-10-23  Brad Taylor  <brad at getcoded.net>
-	
-	* Initial import.
-
diff --git a/UIAutomationClient/Makefile.am b/UIAutomationClient/Makefile.am
index 49f47af..16c5b90 100644
--- a/UIAutomationClient/Makefile.am
+++ b/UIAutomationClient/Makefile.am
@@ -7,7 +7,12 @@ ASSEMBLY_COMPILER_FLAGS = -lib:@expanded_libdir@/mono/2.0 -lib:../bin -lib:@expa
 ASSEMBLY = ../bin/UIAutomationClient.dll
 ASSEMBLY_MDB = $(ASSEMBLY).mdb
 COMPILE_TARGET = library
-PROJECT_REFERENCES = 
+PROJECT_REFERENCES =  \
+	../bin/UIAutomationBridge.dll \
+	../bin/UIAutomationTypes.dll \
+	../bin/UIAutomationSource.dll \
+	../bin/UIAutomationProvider.dll
+
 BUILD_DIR = ../bin
 PACKAGE_FLAG = /package accessibility
 
@@ -25,17 +30,52 @@ RESGEN=resgen2
 	
 all: $(ASSEMBLY) $(PROGRAMFILES)
 
-FILES =  \
-        AssemblyInfo.cs \
-        ../build/common/*.cs \
-	System.Windows.Automation/AutomationElementCollection.cs \
+PROJECT_SOURCE_FILES =  \
+	System.Windows.Automation.Text/TextPatternRange.cs \
+	System.Windows.Automation/AndCondition.cs \
+	System.Windows.Automation/Automation.cs \
+	System.Windows.Automation/AutomationElement.AutomationElementInformation.cs \
 	System.Windows.Automation/AutomationElement.cs \
+	System.Windows.Automation/AutomationElementCollection.cs \
 	System.Windows.Automation/AutomationElementMode.cs \
+	System.Windows.Automation/AutomationFocusChangedEventArgs.cs \
 	System.Windows.Automation/BasePattern.cs \
+	System.Windows.Automation/BoolCondition.cs \
 	System.Windows.Automation/CacheRequest.cs \
+	System.Windows.Automation/ClientSettings.cs \
+	System.Windows.Automation/ClientSideProviderDescription.cs \
 	System.Windows.Automation/Condition.cs \
+	System.Windows.Automation/DesktopElement.cs \
+	System.Windows.Automation/DockPattern.cs \
+	System.Windows.Automation/ExpandCollapsePattern.cs \
+	System.Windows.Automation/GridItemPattern.cs \
+	System.Windows.Automation/GridPattern.cs \
+	System.Windows.Automation/InvokePattern.cs \
+	System.Windows.Automation/MultipleViewPattern.cs \
+	System.Windows.Automation/NativeMethods.cs \
+	System.Windows.Automation/NotCondition.cs \
+	System.Windows.Automation/OrCondition.cs \
+	System.Windows.Automation/PropertyConditon.cs \
+	System.Windows.Automation/RangeValuePattern.cs \
+	System.Windows.Automation/ScrollItemPattern.cs \
+	System.Windows.Automation/ScrollPattern.cs \
+	System.Windows.Automation/SelectionItemPattern.cs \
+	System.Windows.Automation/SelectionPattern.cs \
+	System.Windows.Automation/SourceManager.cs \
+	System.Windows.Automation/TableItemPattern.cs \
+	System.Windows.Automation/TablePattern.cs \
 	System.Windows.Automation/TextPattern.cs \
-	System.Windows.Automation.Text/TextPatternRange.cs
+	System.Windows.Automation/TogglePattern.cs \
+	System.Windows.Automation/TransformPattern.cs \
+	System.Windows.Automation/TreeWalker.cs \
+	System.Windows.Automation/TreeWalker.TreeIterator.cs \
+	System.Windows.Automation/ValuePattern.cs \
+	System.Windows.Automation/WindowPattern.cs
+
+FILES =  \
+        AssemblyInfo.cs \
+        ../build/common/*.cs \
+	$(PROJECT_SOURCE_FILES)
 
 DATA_FILES = 
 
@@ -44,8 +84,7 @@ RESOURCES =
 REFERENCES =  \
 	WindowsBase \
 	System \
-	UIAutomationTypes \
-	UIAutomationProvider
+	$(GTK_SHARP_20_LIBS)
 
 DLL_REFERENCES = 
 
diff --git a/UIAutomationClient/Makefile.in b/UIAutomationClient/Makefile.in
index 294b1fb..a5bb8d0 100644
--- a/UIAutomationClient/Makefile.in
+++ b/UIAutomationClient/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -17,8 +18,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -32,7 +34,7 @@ NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
 DIST_COMMON = $(srcdir)/AssemblyInfo.cs.in $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(top_srcdir)/Makefile.include ChangeLog
+	$(srcdir)/Makefile.in $(top_srcdir)/Makefile.include
 subdir = UIAutomationClient
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/expansions.m4 \
@@ -41,19 +43,33 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_CLEAN_FILES = AssemblyInfo.cs
-am__installdirs = "$(DESTDIR)$(bindir)" \
-	"$(DESTDIR)$(linuxpkgconfigdir)"
-binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-SCRIPTS = $(bin_SCRIPTS)
-SOURCES =
-DIST_SOURCES =
+CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-linuxpkgconfigDATA_INSTALL = $(INSTALL_DATA)
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(linuxpkgconfigdir)"
+SCRIPTS = $(bin_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
 DATA = $(linuxpkgconfig_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -68,7 +84,11 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 GACUTIL = @GACUTIL@
+GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@
+GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@
 GMCS = @GMCS@
+GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@
+GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -98,6 +118,7 @@ SHELL = @SHELL@
 SN = @SN@
 STRIP = @STRIP@
 VERSION = @VERSION@
+WINDOWSBASE_LIBS = @WINDOWSBASE_LIBS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
@@ -148,7 +169,12 @@ ASSEMBLY_COMPILER_FLAGS = -lib:@expanded_libdir@/mono/2.0 -lib:../bin -lib:@expa
 ASSEMBLY = ../bin/UIAutomationClient.dll
 ASSEMBLY_MDB = $(ASSEMBLY).mdb
 COMPILE_TARGET = library
-PROJECT_REFERENCES = 
+PROJECT_REFERENCES = \
+	../bin/UIAutomationBridge.dll \
+	../bin/UIAutomationTypes.dll \
+	../bin/UIAutomationSource.dll \
+	../bin/UIAutomationProvider.dll
+
 BUILD_DIR = ../bin
 PACKAGE_FLAG = /package accessibility
 UIAUTOMATIONCLIENT_DLL_MDB_SOURCE = ../bin/UIAutomationClient.dll.mdb
@@ -159,25 +185,59 @@ PROGRAMFILES = \
 	$(UIAUTOMATIONCLIENT_DLL_MDB)  
 
 RESGEN = resgen2
-FILES = \
-        AssemblyInfo.cs \
-        ../build/common/*.cs \
-	System.Windows.Automation/AutomationElementCollection.cs \
+PROJECT_SOURCE_FILES = \
+	System.Windows.Automation.Text/TextPatternRange.cs \
+	System.Windows.Automation/AndCondition.cs \
+	System.Windows.Automation/Automation.cs \
+	System.Windows.Automation/AutomationElement.AutomationElementInformation.cs \
 	System.Windows.Automation/AutomationElement.cs \
+	System.Windows.Automation/AutomationElementCollection.cs \
 	System.Windows.Automation/AutomationElementMode.cs \
+	System.Windows.Automation/AutomationFocusChangedEventArgs.cs \
 	System.Windows.Automation/BasePattern.cs \
+	System.Windows.Automation/BoolCondition.cs \
 	System.Windows.Automation/CacheRequest.cs \
+	System.Windows.Automation/ClientSettings.cs \
+	System.Windows.Automation/ClientSideProviderDescription.cs \
 	System.Windows.Automation/Condition.cs \
+	System.Windows.Automation/DesktopElement.cs \
+	System.Windows.Automation/DockPattern.cs \
+	System.Windows.Automation/ExpandCollapsePattern.cs \
+	System.Windows.Automation/GridItemPattern.cs \
+	System.Windows.Automation/GridPattern.cs \
+	System.Windows.Automation/InvokePattern.cs \
+	System.Windows.Automation/MultipleViewPattern.cs \
+	System.Windows.Automation/NativeMethods.cs \
+	System.Windows.Automation/NotCondition.cs \
+	System.Windows.Automation/OrCondition.cs \
+	System.Windows.Automation/PropertyConditon.cs \
+	System.Windows.Automation/RangeValuePattern.cs \
+	System.Windows.Automation/ScrollItemPattern.cs \
+	System.Windows.Automation/ScrollPattern.cs \
+	System.Windows.Automation/SelectionItemPattern.cs \
+	System.Windows.Automation/SelectionPattern.cs \
+	System.Windows.Automation/SourceManager.cs \
+	System.Windows.Automation/TableItemPattern.cs \
+	System.Windows.Automation/TablePattern.cs \
 	System.Windows.Automation/TextPattern.cs \
-	System.Windows.Automation.Text/TextPatternRange.cs
+	System.Windows.Automation/TogglePattern.cs \
+	System.Windows.Automation/TransformPattern.cs \
+	System.Windows.Automation/TreeWalker.cs \
+	System.Windows.Automation/TreeWalker.TreeIterator.cs \
+	System.Windows.Automation/ValuePattern.cs \
+	System.Windows.Automation/WindowPattern.cs
+
+FILES = \
+        AssemblyInfo.cs \
+        ../build/common/*.cs \
+	$(PROJECT_SOURCE_FILES)
 
 DATA_FILES = 
 RESOURCES = 
 REFERENCES = \
 	WindowsBase \
 	System \
-	UIAutomationTypes \
-	UIAutomationProvider
+	$(GTK_SHARP_20_LIBS)
 
 DLL_REFERENCES = 
 CLEANFILES = $(PROGRAMFILES) $(ASSEMBLY) $(ASSEMBLY).mdb $(BINARIES) \
@@ -259,14 +319,14 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(a
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  UIAutomationClient/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  UIAutomationClient/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign UIAutomationClient/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign UIAutomationClient/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -284,44 +344,63 @@ $(top_srcdir)/configure:  $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 AssemblyInfo.cs: $(top_builddir)/config.status $(srcdir)/AssemblyInfo.cs.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 install-binSCRIPTS: $(bin_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	    $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-binSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
 install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(linuxpkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)"
-	@list='$(linuxpkgconfig_DATA)'; for p in $$list; do \
+	@list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(linuxpkgconfigDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(linuxpkgconfigdir)/$$f'"; \
-	  $(linuxpkgconfigDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(linuxpkgconfigdir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(linuxpkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \
 	done
 
 uninstall-linuxpkgconfigDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(linuxpkgconfig_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(linuxpkgconfigdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(linuxpkgconfigdir)/$$f"; \
-	done
+	@list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(linuxpkgconfigdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(linuxpkgconfigdir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -345,13 +424,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -383,6 +466,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -402,6 +486,8 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
@@ -410,18 +496,28 @@ install-data-am: install-data-local install-linuxpkgconfigDATA
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am: install-binSCRIPTS
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -506,6 +602,7 @@ $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafil
 	mkdir -p $(shell dirname $(ASSEMBLY))
 	$(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref)
 	sn -q -R $(ASSEMBLY) $(top_srcdir)/mono.snk
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/UIAutomationClient/System.Windows.Automation.Text/TextPatternRange.cs b/UIAutomationClient/System.Windows.Automation.Text/TextPatternRange.cs
index 8fed698..8724584 100644
--- a/UIAutomationClient/System.Windows.Automation.Text/TextPatternRange.cs
+++ b/UIAutomationClient/System.Windows.Automation.Text/TextPatternRange.cs
@@ -1,38 +1,50 @@
-// Permission is hereby granted, free of charge, to any person obtaining 
-// a copy of this software and associated documentation files (the 
-// "Software"), to deal in the Software without restriction, including 
-// without limitation the rights to use, copy, modify, merge, publish, 
-// distribute, sublicense, and/or sell copies of the Software, and to 
-// permit persons to whom the Software is furnished to do so, subject to 
-// the following conditions: 
-//  
-// The above copyright notice and this permission notice shall be 
-// included in all copies or substantial portions of the Software. 
-//  
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
 // 
-// Copyright (c) 2008 Novell, Inc. (http://www.novell.com) 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
 // 
-// Authors: 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (c) 2008 Novell, Inc. (http://www.novell.com)
+//
+// Authors:
 //      Brad Taylor <brad at getcoded.net>
-// 
+//      Mike Gorse <mgorse at novell.com>
+//
 
 using System;
 using System.Runtime.InteropServices;
+using Mono.UIAutomation.Source;
 
 namespace System.Windows.Automation.Text
 {
 	public class TextPatternRange
 	{
+#region Private Fields
+		private ITextPatternRange source;
+#endregion
+
 #region Public Properties
 		public TextPattern TextPattern {
-			get { throw new NotImplementedException (); }
+			get; private set;
+		}
+
+		internal ITextPatternRange Source {
+			get {
+				return source;
+			}
 		}
 #endregion
 
@@ -40,99 +52,116 @@ namespace System.Windows.Automation.Text
 		private TextPatternRange ()
 		{
 		}
+
+		internal TextPatternRange (TextPattern textPattern, ITextPatternRange source)
+		{
+			TextPattern = textPattern;
+			this.source = source;
+		}
 #endregion
 
 #region Public Methods
 		public void AddToSelection ()
 		{
-			throw new NotImplementedException ();
+			source.AddToSelection ();
+		}
+
+		public TextPatternRange Clone ()
+		{
+			return new TextPatternRange (TextPattern, source.Clone ());
 		}
 
 		public bool Compare (TextPatternRange range)
 		{
-			throw new NotImplementedException ();
+			return source.Compare (range.Source);
 		}
 
 		public int CompareEndpoints (TextPatternRangeEndpoint endpoint,
 		                             TextPatternRange targetRange,
 		                             TextPatternRangeEndpoint targetEndpoint)
 		{
-			throw new NotImplementedException ();
+			return source.CompareEndpoints (endpoint, targetRange.Source, targetEndpoint);
 		}
 
 		public void ExpandToEnclosingUnit (TextUnit unit)
 		{
-			throw new NotImplementedException ();
+			source.ExpandToEnclosingUnit (unit);
 		}
 
 		public TextPatternRange FindAttribute (AutomationTextAttribute attribute,
 		                                       Object @value, bool backward)
 		{
-			throw new NotImplementedException ();
+			ITextPatternRange range = source.FindAttribute (attribute, value, backward);
+			if (range == null)
+				return null;
+			return new TextPatternRange (TextPattern, range);
 		}
-		
+
 		public TextPatternRange FindText (string text, bool backward,
 		                                  bool ignoreCase)
 		{
-			throw new NotImplementedException ();
+			ITextPatternRange range = source.FindText (text, backward, ignoreCase);
+			if (range == null)
+				return null;
+			return new TextPatternRange (TextPattern, range);
 		}
 
 		public Object GetAttributeValue (AutomationTextAttribute attribute)
 		{
-			throw new NotImplementedException ();
+			return source.GetAttributeValue (attribute);
 		}
 
 		public Rect[] GetBoundingRectangles ()
 		{
-			throw new NotImplementedException ();
+			return source.GetBoundingRectangles ();
 		}
 
 		public AutomationElement[] GetChildren ()
 		{
-			throw new NotImplementedException ();
+			return SourceManager.GetOrCreateAutomationElements (source.GetChildren ());
 		}
-		
+
 		public AutomationElement GetEnclosingElement ()
 		{
-			throw new NotImplementedException ();
+			return SourceManager.GetOrCreateAutomationElement (source.GetEnclosingElement ());
 		}
 
 		public string GetText (int maxLength)
 		{
-			throw new NotImplementedException ();
+			return source.GetText (maxLength);
 		}
 
 		public int Move (TextUnit unit, int count)
 		{
-			throw new NotImplementedException ();
+			return source.Move (unit, count);
 		}
 
 		public void MoveEndpointByRange (TextPatternRangeEndpoint endpoint,
 		                                 TextPatternRange targetRange,
 		                                 TextPatternRangeEndpoint targetEndpoint)
 		{
-			throw new NotImplementedException ();
+			source.MoveEndpointByRange (endpoint, targetRange.Source, targetEndpoint);
 		}
 
 		public int MoveEndpointByUnit (TextPatternRangeEndpoint endpoint,
 		                               TextUnit unit, int count)
 		{
-			throw new NotImplementedException ();
+			return source.MoveEndpointByUnit (endpoint, unit, count);
 		}
 
 		public void RemoveFromSelection ()
 		{
-			throw new NotImplementedException ();
+			source.RemoveFromSelection ();
 		}
 
 		public void ScrollIntoView (bool alignToTop)
 		{
-			throw new NotImplementedException ();
+			source.ScrollIntoView (alignToTop);
 		}
-		
+
 		public void Select ()
 		{
-			throw new NotImplementedException ();
+			source.Select ();
 		}
 #endregion
 	}
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClient/System.Windows.Automation/AndCondition.cs
similarity index 72%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClient/System.Windows.Automation/AndCondition.cs
index b0fc424..5c85287 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClient/System.Windows.Automation/AndCondition.cs
@@ -20,31 +20,33 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
 // 
+
 using System;
 
 namespace System.Windows.Automation
 {
-	internal static class CaretPatternIdentifiers
+	public class AndCondition : Condition
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
+		private Condition [] conditions;
+
+		public AndCondition (params Condition [] conditions)
+		{
+			this.conditions = conditions;
+		}
+
+		public Condition [] GetConditions ()
+		{
+			return conditions;
+		}
+
+		internal override bool AppliesTo (AutomationElement element)
 		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+			foreach (Condition cond in conditions)
+				if (!cond.AppliesTo (element))
+					return false;
+			return true;
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
 	}
 }
diff --git a/UIAutomationClient/System.Windows.Automation/Automation.cs b/UIAutomationClient/System.Windows.Automation/Automation.cs
new file mode 100644
index 0000000..26c2cba
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/Automation.cs
@@ -0,0 +1,490 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+// 
+
+using System;
+using System.Collections.Generic;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+using MUS = Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public static class Automation
+	{
+		private static Dictionary<AutomationFocusChangedEventHandler, MUS.FocusChangedEventHandler>
+			focusHandlerMapping = new Dictionary<AutomationFocusChangedEventHandler, MUS.FocusChangedEventHandler> ();
+
+		static Automation ()
+		{
+			RawViewCondition = Condition.TrueCondition;
+			ControlViewCondition =
+				new NotCondition (new PropertyCondition (AEIds.IsControlElementProperty, false));
+			ContentViewCondition =
+				new NotCondition (new OrCondition (new PropertyCondition (AEIds.IsControlElementProperty, false),
+				                                   new PropertyCondition (AEIds.IsContentElementProperty, false)));
+		}
+
+		public static bool Compare (int [] runtimeId1, int [] runtimeId2)
+		{
+			if (runtimeId1 == null)
+				throw new ArgumentNullException ("runtimeId1");
+			if (runtimeId2 == null)
+				throw new ArgumentNullException ("runtimeId2");
+			if (runtimeId1.Length != runtimeId2.Length)
+				return false;
+			for (int i = 0; i < runtimeId1.Length; i++)
+				if (runtimeId1 [i] != runtimeId2 [i])
+					return false;
+			return true;
+		}
+
+		public static bool Compare (AutomationElement el1, AutomationElement el2)
+		{
+			if (el1 == null)
+				throw new ArgumentNullException ("el1");
+			if (el2 == null)
+				throw new ArgumentNullException ("el2");
+			return Compare (el1.GetRuntimeId (),
+			                el2.GetRuntimeId ());
+		}
+
+		public static string PatternName (AutomationPattern pattern)
+		{
+			if (pattern == null)
+				throw new ArgumentNullException ("pattern");
+
+			if (pattern == DockPatternIdentifiers.Pattern)
+				return "Dock";
+			else if (pattern == ExpandCollapsePatternIdentifiers.Pattern)
+				return "ExpandCollapse";
+			else if (pattern == GridItemPatternIdentifiers.Pattern)
+				return "GridItem";
+			else if (pattern == GridPatternIdentifiers.Pattern)
+				return "Grid";
+			else if (pattern == InvokePatternIdentifiers.Pattern)
+				return "Invoke";
+			else if (pattern == MultipleViewPatternIdentifiers.Pattern)
+				return "MultipleView";
+			else if (pattern == RangeValuePatternIdentifiers.Pattern)
+				return "RangeValue";
+			else if (pattern == ScrollItemPatternIdentifiers.Pattern)
+				return "ScrollItem";
+			else if (pattern == ScrollPatternIdentifiers.Pattern)
+				return "Scroll";
+			else if (pattern == SelectionItemPatternIdentifiers.Pattern)
+				return "SelectionItem";
+			else if (pattern == SelectionPatternIdentifiers.Pattern)
+				return "Selection";
+			else if (pattern == TableItemPatternIdentifiers.Pattern)
+				return "TableItem";
+			else if (pattern == TablePatternIdentifiers.Pattern)
+				return "Table";
+			else if (pattern == TextPatternIdentifiers.Pattern)
+				return "Text";
+			else if (pattern == TogglePatternIdentifiers.Pattern)
+				return "Toggle";
+			else if (pattern == TransformPatternIdentifiers.Pattern)
+				return "Transform";
+			else if (pattern == ValuePatternIdentifiers.Pattern)
+				return "Value";
+			else if (pattern == WindowPatternIdentifiers.Pattern)
+				return "Window";
+
+			return null;
+		}
+
+		public static string PropertyName (AutomationProperty property)
+		{
+			if (property == null)
+				throw new ArgumentNullException ("property");
+
+			if (property == AEIds.AcceleratorKeyProperty)
+				return "AcceleratorKey";
+			else if (property == AEIds.AccessKeyProperty)
+				return "AccessKey";
+			else if (property == AEIds.AutomationIdProperty)
+				return "AutomationId";
+			else if (property == AEIds.BoundingRectangleProperty)
+				return "BoundingRectangle";
+			else if (property == AEIds.ClassNameProperty)
+				return "ClassName";
+			else if (property == AEIds.ClickablePointProperty)
+				return "ClickablePoint";
+			else if (property == AEIds.ControlTypeProperty)
+				return "ControlType";
+			else if (property == AEIds.CultureProperty)
+				return "Culture";
+			else if (property == AEIds.FrameworkIdProperty)
+				return "FrameworkId";
+			else if (property == AEIds.HasKeyboardFocusProperty)
+				return "HasKeyboardFocus";
+			else if (property == AEIds.HelpTextProperty)
+				return "HelpText";
+			else if (property == AEIds.IsContentElementProperty)
+				return "IsContentElement";
+			else if (property == AEIds.IsControlElementProperty)
+				return "IsControlElement";
+			else if (property == AEIds.IsDockPatternAvailableProperty)
+				return "IsDockPatternAvailable";
+			else if (property == AEIds.IsEnabledProperty)
+				return "IsEnabled";
+			else if (property == AEIds.IsExpandCollapsePatternAvailableProperty)
+				return "IsExpandCollapsePatternAvailable";
+			else if (property == AEIds.IsGridItemPatternAvailableProperty)
+				return "IsGridItemPatternAvailable";
+			else if (property == AEIds.IsGridPatternAvailableProperty)
+				return "IsGridPatternAvailable";
+			else if (property == AEIds.IsInvokePatternAvailableProperty)
+				return "IsInvokePatternAvailable";
+			else if (property == AEIds.IsKeyboardFocusableProperty)
+				return "IsKeyboardFocusable";
+			else if (property == AEIds.IsMultipleViewPatternAvailableProperty)
+				return "IsMultipleViewPatternAvailable";
+			else if (property == AEIds.IsOffscreenProperty)
+				return "IsOffscreen";
+			else if (property == AEIds.IsPasswordProperty)
+				return "IsPassword";
+			else if (property == AEIds.IsRangeValuePatternAvailableProperty)
+				return "IsRangeValuePatternAvailable";
+			else if (property == AEIds.IsRequiredForFormProperty)
+				return "IsRequiredForForm";
+			else if (property == AEIds.IsScrollItemPatternAvailableProperty)
+				return "IsScrollItemPatternAvailable";
+			else if (property == AEIds.IsScrollPatternAvailableProperty)
+				return "IsScrollPatternAvailable";
+			else if (property == AEIds.IsSelectionItemPatternAvailableProperty)
+				return "IsSelectionItemPatternAvailable";
+			else if (property == AEIds.IsSelectionPatternAvailableProperty)
+				return "IsSelectionPatternAvailable";
+			else if (property == AEIds.IsTableItemPatternAvailableProperty)
+				return "IsTableItemPatternAvailable";
+			else if (property == AEIds.IsTablePatternAvailableProperty)
+				return "IsTablePatternAvailable";
+			else if (property == AEIds.IsTextPatternAvailableProperty)
+				return "IsTextPatternAvailable";
+			else if (property == AEIds.IsTogglePatternAvailableProperty)
+				return "IsTogglePatternAvailable";
+			else if (property == AEIds.IsTransformPatternAvailableProperty)
+				return "IsTransformPatternAvailable";
+			else if (property == AEIds.IsValuePatternAvailableProperty)
+				return "IsValuePatternAvailable";
+			else if (property == AEIds.IsWindowPatternAvailableProperty)
+				return "IsWindowPatternAvailable";
+			else if (property == AEIds.ItemStatusProperty)
+				return "ItemStatus";
+			else if (property == AEIds.ItemTypeProperty)
+				return "ItemType";
+			else if (property == AEIds.LabeledByProperty)
+				return "LabeledBy";
+			else if (property == AEIds.LocalizedControlTypeProperty)
+				return "LocalizedControlType";
+			else if (property == AEIds.NameProperty)
+				return "Name";
+			else if (property == AEIds.NativeWindowHandleProperty)
+				return "NativeWindowHandle";
+			else if (property == AEIds.OrientationProperty)
+				return "Orientation";
+			else if (property == AEIds.ProcessIdProperty)
+				return "ProcessId";
+			else if (property == AEIds.RuntimeIdProperty)
+				return "RuntimeId";
+			else if (property == DockPatternIdentifiers.DockPositionProperty)
+				return "DockPosition";
+			else if (property == ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty)
+				return "ExpandCollapseState";
+			else if (property == GridItemPatternIdentifiers.ColumnProperty)
+				return "Column";
+			else if (property == GridItemPatternIdentifiers.ColumnSpanProperty)
+				return "ColumnSpan";
+			else if (property == GridItemPatternIdentifiers.ContainingGridProperty)
+				return "ContainingGrid";
+			else if (property == GridItemPatternIdentifiers.RowProperty)
+				return "Row";
+			else if (property == GridItemPatternIdentifiers.RowSpanProperty)
+				return "RowSpan";
+			else if (property == GridPatternIdentifiers.ColumnCountProperty)
+				return "ColumnCount";
+			else if (property == GridPatternIdentifiers.RowCountProperty)
+				return "RowCount";
+			else if (property == MultipleViewPatternIdentifiers.CurrentViewProperty)
+				return "CurrentView";
+			else if (property == MultipleViewPatternIdentifiers.SupportedViewsProperty)
+				return "SupportedViews";
+			else if (property == RangeValuePatternIdentifiers.IsReadOnlyProperty)
+				return "IsReadOnly";
+			else if (property == RangeValuePatternIdentifiers.LargeChangeProperty)
+				return "LargeChange";
+			else if (property == RangeValuePatternIdentifiers.MaximumProperty)
+				return "Maximum";
+			else if (property == RangeValuePatternIdentifiers.MinimumProperty)
+				return "Minimum";
+			else if (property == RangeValuePatternIdentifiers.SmallChangeProperty)
+				return "SmallChange";
+			else if (property == RangeValuePatternIdentifiers.ValueProperty)
+				return "Value";
+			else if (property == ScrollPatternIdentifiers.HorizontallyScrollableProperty)
+				return "HorizontallyScrollable";
+			else if (property == ScrollPatternIdentifiers.HorizontalScrollPercentProperty)
+				return "HorizontalScrollPercent";
+			else if (property == ScrollPatternIdentifiers.HorizontalViewSizeProperty)
+				return "HorizontalViewSize";
+			else if (property == ScrollPatternIdentifiers.VerticallyScrollableProperty)
+				return "VerticallyScrollable";
+			else if (property == ScrollPatternIdentifiers.VerticalScrollPercentProperty)
+				return "VerticalScrollPercent";
+			else if (property == ScrollPatternIdentifiers.VerticalViewSizeProperty)
+				return "VerticalViewSize";
+			else if (property == SelectionItemPatternIdentifiers.IsSelectedProperty)
+				return "IsSelected";
+			else if (property == SelectionItemPatternIdentifiers.SelectionContainerProperty)
+				return "SelectionContainer";
+			else if (property == SelectionPatternIdentifiers.CanSelectMultipleProperty)
+				return "CanSelectMultiple";
+			else if (property == SelectionPatternIdentifiers.IsSelectionRequiredProperty)
+				return "IsSelectionRequired";
+			else if (property == SelectionPatternIdentifiers.SelectionProperty)
+				return "Selection";
+			else if (property == TableItemPatternIdentifiers.ColumnHeaderItemsProperty)
+				return "ColumnHeaderItems";
+			else if (property == TableItemPatternIdentifiers.RowHeaderItemsProperty)
+				return "RowHeaderItems";
+			else if (property == TablePatternIdentifiers.ColumnHeadersProperty)
+				return "ColumnHeaders";
+			else if (property == TablePatternIdentifiers.RowHeadersProperty)
+				return "RowHeaders";
+			else if (property == TablePatternIdentifiers.RowOrColumnMajorProperty)
+				return "RowOrColumnMajor";
+			else if (property == TogglePatternIdentifiers.ToggleStateProperty)
+				return "ToggleState";
+			else if (property == TransformPatternIdentifiers.CanMoveProperty)
+				return "CanMove";
+			else if (property == TransformPatternIdentifiers.CanResizeProperty)
+				return "CanResize";
+			else if (property == TransformPatternIdentifiers.CanRotateProperty)
+				return "CanRotate";
+			else if (property == ValuePatternIdentifiers.IsReadOnlyProperty)
+				return "IsReadOnly";
+			else if (property == ValuePatternIdentifiers.ValueProperty)
+				return "Value";
+			else if (property == WindowPatternIdentifiers.CanMaximizeProperty)
+				return "CanMaximize";
+			else if (property == WindowPatternIdentifiers.CanMinimizeProperty)
+				return "CanMinimize";
+			else if (property == WindowPatternIdentifiers.IsModalProperty)
+				return "IsModal";
+			else if (property == WindowPatternIdentifiers.IsTopmostProperty)
+				return "IsTopmost";
+			else if (property == WindowPatternIdentifiers.WindowInteractionStateProperty)
+				return "WindowInteractionState";
+			else if (property == WindowPatternIdentifiers.WindowVisualStateProperty)
+				return "WindowVisualState";
+
+			return null;
+		}
+
+		public static void AddAutomationEventHandler (AutomationEvent eventId,
+		                                       AutomationElement element,
+		                                       TreeScope scope,
+		                                       AutomationEventHandler eventHandler)
+		{
+			if (element == null)
+				throw new ArgumentNullException ("element");
+			if (eventHandler == null)
+				throw new ArgumentNullException ("eventHandler");
+			//TODO In theory we shall also check scope not equals to Parent or Ancestors,
+			//but .Net didn't test/throw exceptions for "scope"
+
+			CheckAutomationEventId (eventId.Id);
+			if (element == AutomationElement.RootElement)
+				foreach (var source in SourceManager.GetAutomationSources ())
+					source.AddAutomationEventHandler (
+						eventId, null, scope, eventHandler);
+			else {
+				var source = element.SourceElement.AutomationSource;
+				source.AddAutomationEventHandler (
+					eventId, element.SourceElement, scope, eventHandler);
+			}
+		}
+
+		public static void AddAutomationFocusChangedEventHandler (AutomationFocusChangedEventHandler eventHandler)
+		{
+			if (eventHandler == null)
+				throw new ArgumentNullException ("eventHandler");
+
+			MUS.FocusChangedEventHandler sourceHandler;
+			//according to the spec, all static methods in the UIA lib shall be thread safe.
+			lock (focusHandlerMapping) {
+				if (!focusHandlerMapping.TryGetValue (eventHandler, out sourceHandler)) {
+					sourceHandler = (element, objectId, childId) => eventHandler (
+						SourceManager.GetOrCreateAutomationElement (element),
+						new AutomationFocusChangedEventArgs (objectId, childId));
+					focusHandlerMapping.Add (eventHandler, sourceHandler);
+				}
+			}
+			foreach (var source in SourceManager.GetAutomationSources ())
+				source.AddAutomationFocusChangedEventHandler (sourceHandler);
+		}
+
+		public static void AddAutomationPropertyChangedEventHandler (AutomationElement element,
+		                                                      TreeScope scope,
+		                                                      AutomationPropertyChangedEventHandler eventHandler,
+		                                                      params AutomationProperty [] properties)
+		{
+			if (element == null)
+				throw new ArgumentNullException ("element");
+			if (eventHandler == null)
+				throw new ArgumentNullException ("eventHandler");
+
+			if (element == AutomationElement.RootElement)
+				foreach (var source in SourceManager.GetAutomationSources ())
+					source.AddAutomationPropertyChangedEventHandler (
+						null, scope, eventHandler, properties);
+			else {
+				var source = element.SourceElement.AutomationSource;
+				source.AddAutomationPropertyChangedEventHandler (
+					element.SourceElement, scope, eventHandler, properties);
+			}
+		}
+
+		public static void AddStructureChangedEventHandler (AutomationElement element,
+		                                             TreeScope scope,
+		                                             StructureChangedEventHandler eventHandler)
+		{
+			if (element == null)
+				throw new ArgumentNullException ("element");
+			if (eventHandler == null)
+				throw new ArgumentNullException ("eventHandler");
+
+			if (element == AutomationElement.RootElement)
+				foreach (var source in SourceManager.GetAutomationSources ())
+					source.AddStructureChangedEventHandler (
+						null, scope, eventHandler);
+			else {
+				var source = element.SourceElement.AutomationSource;
+				source.AddStructureChangedEventHandler (
+					element.SourceElement, scope, eventHandler);
+			}
+		}
+
+		public static void RemoveAllEventHandlers ()
+		{
+			lock (focusHandlerMapping)
+				focusHandlerMapping.Clear ();
+			foreach (var source in SourceManager.GetAutomationSources ())
+				source.RemoveAllEventHandlers ();
+			AddAutomationFocusChangedEventHandler (AutomationElement.OnFocusChanged);
+		}
+
+		public static void RemoveAutomationEventHandler (
+			AutomationEvent eventId,
+			AutomationElement element,
+			AutomationEventHandler eventHandler)
+		{
+			if (element == null)
+				throw new ArgumentNullException ("element");
+			if (eventHandler == null)
+				throw new ArgumentNullException ("eventHandler");
+
+			CheckAutomationEventId (eventId.Id);
+
+			if (element == AutomationElement.RootElement)
+				foreach (var source in SourceManager.GetAutomationSources ())
+					source.RemoveAutomationEventHandler (
+						eventId, element.SourceElement, eventHandler);
+			else {
+				var source = element.SourceElement.AutomationSource;
+				source.RemoveAutomationEventHandler (eventId, element.SourceElement, eventHandler);
+			}
+		}
+
+		public static void RemoveAutomationFocusChangedEventHandler (AutomationFocusChangedEventHandler eventHandler)
+		{
+			if (eventHandler == null)
+				throw new ArgumentNullException ("eventHandler");
+
+			MUS.FocusChangedEventHandler sourceHandler;
+			lock (focusHandlerMapping) {
+				if (focusHandlerMapping.TryGetValue (eventHandler, out sourceHandler)) {
+					focusHandlerMapping.Remove (eventHandler);
+					foreach (var source in SourceManager.GetAutomationSources ())
+						source.RemoveAutomationFocusChangedEventHandler (sourceHandler);
+				}
+			}
+		}
+
+		public static void RemoveAutomationPropertyChangedEventHandler (
+			AutomationElement element, AutomationPropertyChangedEventHandler eventHandler)
+		{
+			if (element == null)
+				throw new ArgumentNullException ("element");
+			if (eventHandler == null)
+				throw new ArgumentNullException ("eventHandler");
+
+			if (element == AutomationElement.RootElement)
+				foreach (var source in SourceManager.GetAutomationSources ())
+					source.RemoveAutomationPropertyChangedEventHandler (
+						null, eventHandler);
+			else {
+				var source = element.SourceElement.AutomationSource;
+				source.RemoveAutomationPropertyChangedEventHandler (
+					element.SourceElement, eventHandler);
+			}
+		}
+
+		public static void RemoveStructureChangedEventHandler (
+			AutomationElement element, StructureChangedEventHandler eventHandler)
+		{
+			if (element == null)
+				throw new ArgumentNullException ("element");
+			if (eventHandler == null)
+				throw new ArgumentNullException ("eventHandler");
+
+			if (element == AutomationElement.RootElement)
+				foreach (var source in SourceManager.GetAutomationSources ())
+					source.RemoveStructureChangedEventHandler (
+						null, eventHandler);
+			else {
+				var source = element.SourceElement.AutomationSource;
+				source.RemoveStructureChangedEventHandler (
+					element.SourceElement, eventHandler);
+			}
+		}
+
+		private static void CheckAutomationEventId (int eventId)
+		{
+			if (AutomationElementIdentifiers.AutomationFocusChangedEvent.Id == eventId
+				|| AutomationElementIdentifiers.AutomationFocusChangedEvent.Id == eventId
+				|| AutomationElementIdentifiers.AutomationPropertyChangedEvent.Id == eventId
+				|| AutomationElementIdentifiers.StructureChangedEvent.Id == eventId)
+				throw new ArgumentException ("eventId");
+		}
+
+		public static readonly Condition ContentViewCondition;
+
+		public static readonly Condition ControlViewCondition;
+
+		public static readonly Condition RawViewCondition;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/AutomationElement.AutomationElementInformation.cs b/UIAutomationClient/System.Windows.Automation/AutomationElement.AutomationElementInformation.cs
new file mode 100644
index 0000000..28b89ad
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/AutomationElement.AutomationElementInformation.cs
@@ -0,0 +1,190 @@
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//  
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
+// 
+// Authors:
+//      Sandy Armstrong <sanfordarmstrong at gmail.com>
+// 
+
+using System;
+
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public sealed partial class AutomationElement
+	{
+		public struct AutomationElementInformation
+		{
+			private AutomationElement element;
+			bool cache;
+
+			internal AutomationElementInformation (AutomationElement element, bool cache)
+			{
+				this.element = element;
+				this.cache = cache;
+			}
+
+			public string AcceleratorKey {
+				get {
+					return (string) element.GetPropertyValue (AutomationElement.AcceleratorKeyProperty, cache);
+				}
+			}
+
+			public string AccessKey {
+				get {
+					return (string) element.GetPropertyValue (AutomationElement.AccessKeyProperty, cache);
+				}
+			}
+
+			public string AutomationId {
+				get {
+					return (string) element.GetPropertyValue (AutomationElement.AutomationIdProperty, cache);
+				}
+			}
+
+			public Rect BoundingRectangle {
+				get {
+					return (Rect) element.GetPropertyValue (AutomationElement.BoundingRectangleProperty, cache);
+				}
+			}
+
+			public string ClassName {
+				get {
+					return (string) element.GetPropertyValue (AutomationElement.ClassNameProperty, cache);
+				}
+			}
+
+			public ControlType ControlType {
+				get {
+					return (ControlType) element.GetPropertyValue (AutomationElement.ControlTypeProperty, cache);
+				}
+			}
+
+			public string FrameworkId {
+				get {
+					return (string) element.GetPropertyValue (AutomationElement.FrameworkIdProperty, cache);
+				}
+			}
+
+			public bool HasKeyboardFocus {
+				get {
+					return (bool) element.GetPropertyValue (AutomationElement.HasKeyboardFocusProperty, cache);
+				}
+			}
+
+			public string HelpText {
+				get {
+					return (string) element.GetPropertyValue (AutomationElement.HelpTextProperty, cache);
+				}
+			}
+
+			public bool IsContentElement {
+				get {
+					return (bool) element.GetPropertyValue (AutomationElement.IsContentElementProperty, cache);
+				}
+			}
+
+			public bool IsControlElement {
+				get {
+					return (bool) element.GetPropertyValue (AutomationElement.IsControlElementProperty, cache);
+				}
+			}
+
+			public bool IsEnabled {
+				get {
+					return (bool) element.GetPropertyValue (AutomationElement.IsEnabledProperty, cache);
+				}
+			}
+
+			public bool IsKeyboardFocusable {
+				get {
+					return (bool) element.GetPropertyValue (AutomationElement.IsKeyboardFocusableProperty, cache);
+				}
+			}
+
+			public bool IsOffscreen {
+				get {
+					return (bool) element.GetPropertyValue (AutomationElement.IsOffscreenProperty, cache);
+				}
+			}
+
+			public bool IsPassword {
+				get {
+					return (bool) element.GetPropertyValue (AutomationElement.IsPasswordProperty, cache);
+				}
+			}
+
+			public bool IsRequiredForForm {
+				get {
+					return (bool) element.GetPropertyValue (AutomationElement.IsRequiredForFormProperty, cache);
+				}
+			}
+
+			public string ItemStatus {
+				get {
+					return (string) element.GetPropertyValue (AutomationElement.ItemStatusProperty, cache);
+				}
+			}
+
+			public string ItemType {
+				get {
+					return (string) element.GetPropertyValue (AutomationElement.ItemTypeProperty, cache);
+				}
+			}
+
+			public AutomationElement LabeledBy {
+				get {
+					return (AutomationElement) element.GetPropertyValue (AutomationElement.LabeledByProperty, cache);
+				}
+			}
+
+			public string LocalizedControlType {
+				get {
+					return (string) element.GetPropertyValue (AutomationElement.LocalizedControlTypeProperty, cache);
+				}
+			}
+
+			public string Name {
+				get {
+					return (string) element.GetPropertyValue (AutomationElement.NameProperty, cache);
+				}
+			}
+
+			public int NativeWindowHandle {
+				get {
+					return (int) element.GetPropertyValue (AutomationElement.NativeWindowHandleProperty, cache);
+				}
+			}
+
+			public OrientationType Orientation {
+				get {
+					return (OrientationType) element.GetPropertyValue (AutomationElement.OrientationProperty, cache);
+				}
+			}
+
+			public int ProcessId {
+				get {
+					return (int) element.GetPropertyValue (AutomationElement.ProcessIdProperty, cache);
+				}
+			}
+		}
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/AutomationElement.cs b/UIAutomationClient/System.Windows.Automation/AutomationElement.cs
index 67c7376..259fb02 100644
--- a/UIAutomationClient/System.Windows.Automation/AutomationElement.cs
+++ b/UIAutomationClient/System.Windows.Automation/AutomationElement.cs
@@ -21,154 +21,523 @@
 // 
 // Authors: 
 //      Brad Taylor <brad at getcoded.net>
+//      Sandy Armstrong <sanfordarmstrong at gmail.com>
 // 
 
 using System;
+using System.Collections.Generic;
 using System.Windows.Automation.Provider;
 
+using Mono.UIAutomation.Services;
+using Mono.UIAutomation.Source;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+
 namespace System.Windows.Automation
 {
-	public sealed class AutomationElement
+	public sealed partial class AutomationElement
 	{
+#region Private Members
+		private AutomationElementInformation current;
+		private AutomationElementInformation cached;
+		private IElement sourceElement;
+		private Dictionary<int, CachedValue> propertyCache;
+		private AutomationElementMode mode;
+		private List<AutomationElement> cachedChildren;
+		private AutomationElement cachedParent;
+#endregion
+
+#region Private Static Members
+		private static AutomationElement rootElement;
+		private static AutomationElement focusedElement;
+		private static bool isFocusedElementInitialized = false;
+
+		internal static void OnFocusChanged (object sender, AutomationFocusChangedEventArgs e)
+		{
+			AutomationElement ae = sender as AutomationElement;
+			if (ae == null)
+				return;
+			bool hasFocus = false;
+			try {
+				hasFocus = ae.Current.HasKeyboardFocus;
+				if ((!hasFocus) && ae == focusedElement)
+					focusedElement = null;
+				else
+					focusedElement = ae;
+			} catch (ElementNotAvailableException) {
+				focusedElement = null;
+			} catch (Exception ex) {
+				Log.Error ("[OnFocusChanged] Unknown Error: {0}", ex);
+				focusedElement = null;
+			}
+		}
+#endregion
+
+#region Internal Properties
+		internal IElement SourceElement {
+			get { return sourceElement; }
+		}
+
+		internal CacheRequest CacheRequest {
+			get; private set;
+		}
+#endregion
+
 #region Public Properties
 		public AutomationElementInformation Cached {
-			get { throw new NotImplementedException (); }
+			get { return cached; }
 		}
 
 		public AutomationElementCollection CachedChildren {
-			get { throw new NotImplementedException (); }
+			get {
+				if (cachedChildren == null)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return new AutomationElementCollection (cachedChildren);
+			}
 		}
 
 		public AutomationElement CachedParent {
-			get { throw new NotImplementedException (); }
+			get {
+				if (cachedParent == null)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedParent;
+			}
 		}
 
 		public AutomationElementInformation Current {
-			get { throw new NotImplementedException (); }
+			get { return current; }
 		}
 #endregion
 
 #region Public Static Properties
 		public static AutomationElement FocusedElement {
-			get { throw new NotImplementedException (); }
+			get {
+				if (!isFocusedElementInitialized) {
+					foreach (var source in SourceManager.GetAutomationSources ()) {
+						var element = source.GetFocusedElement ();
+						if (element != null) {
+							focusedElement = SourceManager.GetOrCreateAutomationElement (element);
+							break;
+						}
+					}
+					Automation.AddAutomationFocusChangedEventHandler (OnFocusChanged);
+					isFocusedElementInitialized = true;
+				}
+				return focusedElement;
+			}
 		}
 
 		public static AutomationElement RootElement {
-			get { throw new NotImplementedException (); }
+			get { return rootElement; }
+		}
+#endregion
+
+#region Static Constructor
+		static AutomationElement ()
+		{
+			rootElement = new AutomationElement (new DesktopElement ());
 		}
 #endregion
 
 #region Constructor
-		private AutomationElement ()
+		internal AutomationElement (IElement sourceElement)
 		{
+			this.sourceElement = sourceElement;
+			current = new AutomationElementInformation (this, false);
+			cached = new AutomationElementInformation (this, true);
+			propertyCache = new Dictionary<int, CachedValue> ();
+			mode = AutomationElementMode.Full;
 		}
 #endregion
-		
+
 #region Public Methods
 		public override bool Equals (Object obj)
 		{
-			throw new NotImplementedException ();
+			AutomationElement other = obj as AutomationElement;
+			if (null == other)
+				return false;
+
+			return Automation.Compare (this, other);
 		}
 
 		public AutomationElementCollection FindAll (TreeScope scope, Condition condition)
 		{
-			throw new NotImplementedException ();
+			List<AutomationElement> found = Find (scope, condition, false);
+			return new AutomationElementCollection (found);
 		}
 
 		public AutomationElement FindFirst (TreeScope scope, Condition condition)
 		{
-			throw new NotImplementedException ();
+			List<AutomationElement> found = Find (scope, condition, true);
+			if (found.Count > 0)
+				return found [0];
+			return null;
 		}
 
 		public Object GetCachedPattern (AutomationPattern pattern)
 		{
-			throw new NotImplementedException ();
+			return GetPattern (pattern, true);
 		}
 
 		public Object GetCachedPropertyValue (AutomationProperty property)
 		{
-			throw new NotImplementedException ();
+			return GetCachedPropertyValue (property, false);
 		}
 
 		public Object GetCachedPropertyValue (AutomationProperty property,
 		                                      bool ignoreDefaultValue)
 		{
-			throw new NotImplementedException ();
+			CachedValue val = null;
+			bool found = propertyCache.TryGetValue (property.Id,
+			                                        out val);
+			if (!found)
+				throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+			if (ignoreDefaultValue && !val.IsSupported)
+				return NotSupported;
+			return val.Value;
 		}
 
 		public override int GetHashCode ()
 		{
-			throw new NotImplementedException ();
+			int code = 1;
+			foreach (int i in GetRuntimeId ())
+				code = 31 * code + i;
+			return code;
 		}
 
 		public Point GetClickablePoint ()
 		{
-			throw new NotImplementedException ();
+			return sourceElement.ClickablePoint;
 		}
 
 		public Object GetCurrentPattern (AutomationPattern pattern)
 		{
-			throw new NotImplementedException ();
+			return GetPattern (pattern, false);
 		}
 
 		public Object GetCurrentPropertyValue (AutomationProperty property)
 		{
-			throw new NotImplementedException ();
+			// TODO: Throw ElementNotAvailableException if element no longer exists
+			return GetCurrentPropertyValue (property, false);
 		}
 
 		public Object GetCurrentPropertyValue (AutomationProperty property,
 		                                       bool ignoreDefaultValue)
 		{
-			throw new NotImplementedException ();
-		}
-
-		public int[] GetRuntimeId ()
+			// TODO: Is this tested? Also, add message
+			if (mode == AutomationElementMode.None)
+				throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+
+			object pattern;
+
+			// TODO: Throw ElementNotAvailableException if element no longer exists
+
+			// Default values already handled in IElement implementation
+			if (ignoreDefaultValue && !sourceElement.SupportsProperty (property))
+				return NotSupported;
+
+			if (property == AEIds.AcceleratorKeyProperty)
+				return sourceElement.AcceleratorKey;
+			else if (property == AEIds.AccessKeyProperty)
+				return sourceElement.AccessKey;
+			else if (property == AEIds.AutomationIdProperty)
+				return sourceElement.AutomationId;
+			else if (property == AEIds.BoundingRectangleProperty)
+				return sourceElement.BoundingRectangle;
+			else if (property == AEIds.ClassNameProperty)
+				return sourceElement.ClassName;
+			else if (property == AEIds.ClickablePointProperty) {
+				Point clickablePoint;
+				if (TryGetClickablePoint (out clickablePoint))
+					return clickablePoint;
+				return null;
+			}
+			else if (property == AEIds.ControlTypeProperty)
+				return sourceElement.ControlType;
+			else if (property == AEIds.CultureProperty)
+				return null;	// TODO: Implement (new IElement member? not used in UIAutomationWinforms)
+			else if (property == AEIds.FrameworkIdProperty)
+				return sourceElement.FrameworkId;
+			else if (property == AEIds.HasKeyboardFocusProperty)
+				return sourceElement.HasKeyboardFocus;
+			else if (property == AEIds.HelpTextProperty)
+				return sourceElement.HelpText;
+			else if (property == AEIds.IsContentElementProperty)
+				return sourceElement.IsContentElement;
+			else if (property == AEIds.IsControlElementProperty)
+				return sourceElement.IsControlElement;
+			else if (property == AEIds.IsDockPatternAvailableProperty)
+				return TryGetCurrentPattern (DockPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsEnabledProperty)
+				return sourceElement.IsEnabled;
+			else if (property == AEIds.IsExpandCollapsePatternAvailableProperty)
+				return TryGetCurrentPattern (ExpandCollapsePatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsGridItemPatternAvailableProperty)
+				return TryGetCurrentPattern (GridItemPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsGridPatternAvailableProperty)
+				return TryGetCurrentPattern (GridPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsInvokePatternAvailableProperty)
+				return TryGetCurrentPattern (InvokePatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsKeyboardFocusableProperty)
+				return sourceElement.IsKeyboardFocusable;
+			else if (property == AEIds.IsMultipleViewPatternAvailableProperty)
+				return TryGetCurrentPattern (MultipleViewPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsOffscreenProperty)
+				return sourceElement.IsOffscreen;
+			else if (property == AEIds.IsPasswordProperty)
+				return sourceElement.IsPassword;
+			else if (property == AEIds.IsRangeValuePatternAvailableProperty)
+				return TryGetCurrentPattern (RangeValuePatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsRequiredForFormProperty)
+				return sourceElement.IsRequiredForForm;
+			else if (property == AEIds.IsScrollItemPatternAvailableProperty)
+				return TryGetCurrentPattern (ScrollItemPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsScrollPatternAvailableProperty)
+				return TryGetCurrentPattern (ScrollPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsSelectionItemPatternAvailableProperty)
+				return TryGetCurrentPattern (SelectionItemPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsSelectionPatternAvailableProperty)
+				return TryGetCurrentPattern (SelectionPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsTableItemPatternAvailableProperty)
+				return TryGetCurrentPattern (TableItemPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsTablePatternAvailableProperty)
+				return TryGetCurrentPattern (TablePatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsTextPatternAvailableProperty)
+				return TryGetCurrentPattern (TextPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsTogglePatternAvailableProperty)
+				return TryGetCurrentPattern (TogglePatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsTransformPatternAvailableProperty)
+				return TryGetCurrentPattern (TransformPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsValuePatternAvailableProperty)
+				return TryGetCurrentPattern (ValuePatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.IsWindowPatternAvailableProperty)
+				return TryGetCurrentPattern (WindowPatternIdentifiers.Pattern, out pattern);
+			else if (property == AEIds.ItemStatusProperty)
+				return sourceElement.ItemStatus;
+			else if (property == AEIds.ItemTypeProperty)
+				return sourceElement.ItemType;
+			else if (property == AEIds.LabeledByProperty)
+				// TODO: Caching behavior here should be tested more
+				return SourceManager.GetOrCreateAutomationElement (sourceElement.LabeledBy);
+			else if (property == AEIds.LocalizedControlTypeProperty)
+				return sourceElement.LocalizedControlType;
+			else if (property == AEIds.NameProperty)
+				return sourceElement.Name;
+			else if (property == AEIds.NativeWindowHandleProperty)
+				return sourceElement.NativeWindowHandle;
+			else if (property == AEIds.OrientationProperty)
+				return sourceElement.Orientation;
+			else if (property == AEIds.ProcessIdProperty)
+				return sourceElement.ProcessId;
+			else if (property == AEIds.RuntimeIdProperty)
+				return GetRuntimeId ();
+			else if (property == DockPatternIdentifiers.DockPositionProperty)
+				return (TryGetCurrentPattern (DockPatternIdentifiers.Pattern, out pattern)? ((DockPattern)pattern).Source.DockPosition: DockPosition.None);
+			else if (property == ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty)
+				return (TryGetCurrentPattern (ExpandCollapsePatternIdentifiers.Pattern, out pattern)? ((ExpandCollapsePattern)pattern).Source.ExpandCollapseState: ExpandCollapseState.LeafNode);
+			else if (property == GridItemPatternIdentifiers.ColumnProperty)
+				return (TryGetCurrentPattern (GridItemPatternIdentifiers.Pattern, out pattern)? ((GridItemPattern)pattern).Source.Column: 0);
+			else if (property == GridItemPatternIdentifiers.ColumnSpanProperty)
+				return (TryGetCurrentPattern (GridItemPatternIdentifiers.Pattern, out pattern)? ((GridItemPattern)pattern).Source.ColumnSpan: 1);
+			else if (property == GridItemPatternIdentifiers.ContainingGridProperty)
+				return (TryGetCurrentPattern (GridItemPatternIdentifiers.Pattern, out pattern)? SourceManager.GetOrCreateAutomationElement (((GridItemPattern)pattern).Source.ContainingGrid): null);
+			else if (property == GridItemPatternIdentifiers.RowProperty)
+				return (TryGetCurrentPattern (GridItemPatternIdentifiers.Pattern, out pattern)? ((GridItemPattern)pattern).Source.Row: 0);
+			else if (property == GridItemPatternIdentifiers.RowSpanProperty)
+				return (TryGetCurrentPattern (GridItemPatternIdentifiers.Pattern, out pattern)? ((GridItemPattern)pattern).Source.RowSpan: 1);
+			else if (property == GridPatternIdentifiers.ColumnCountProperty)
+				return (TryGetCurrentPattern (GridPatternIdentifiers.Pattern, out pattern)? ((GridPattern)pattern).Source.ColumnCount: 0);
+			else if (property == GridPatternIdentifiers.RowCountProperty)
+				return (TryGetCurrentPattern (GridPatternIdentifiers.Pattern, out pattern)? ((GridPattern)pattern).Source.RowCount: 0);
+			else if (property == MultipleViewPatternIdentifiers.CurrentViewProperty)
+				return (TryGetCurrentPattern (MultipleViewPatternIdentifiers.Pattern, out pattern)? ((MultipleViewPattern)pattern).Source.CurrentView: 0);
+			else if (property == MultipleViewPatternIdentifiers.SupportedViewsProperty)
+				return (TryGetCurrentPattern (MultipleViewPatternIdentifiers.Pattern, out pattern)? ((MultipleViewPattern)pattern).Source.GetSupportedViews (): new int [0]);
+			else if (property == RangeValuePatternIdentifiers.IsReadOnlyProperty)
+				return (TryGetCurrentPattern (RangeValuePatternIdentifiers.Pattern, out pattern)? ((RangeValuePattern)pattern).Source.IsReadOnly: true);
+			else if (property == RangeValuePatternIdentifiers.LargeChangeProperty)
+				return (TryGetCurrentPattern (RangeValuePatternIdentifiers.Pattern, out pattern)? ((RangeValuePattern)pattern).Source.LargeChange: 0);
+			else if (property == RangeValuePatternIdentifiers.MaximumProperty)
+				return (TryGetCurrentPattern (RangeValuePatternIdentifiers.Pattern, out pattern)? ((RangeValuePattern)pattern).Source.Maximum: 0);
+			else if (property == RangeValuePatternIdentifiers.MinimumProperty)
+				return (TryGetCurrentPattern (RangeValuePatternIdentifiers.Pattern, out pattern)? ((RangeValuePattern)pattern).Source.Minimum: 0);
+			else if (property == RangeValuePatternIdentifiers.SmallChangeProperty)
+				return (TryGetCurrentPattern (RangeValuePatternIdentifiers.Pattern, out pattern)? ((RangeValuePattern)pattern).Source.SmallChange: 0);
+			else if (property == RangeValuePatternIdentifiers.ValueProperty)
+				return (TryGetCurrentPattern (RangeValuePatternIdentifiers.Pattern, out pattern)? ((RangeValuePattern)pattern).Source.Value: 0);
+			else if (property == ScrollPatternIdentifiers.HorizontallyScrollableProperty)
+				return (TryGetCurrentPattern (ScrollPatternIdentifiers.Pattern, out pattern)? ((ScrollPattern)pattern).Source.HorizontallyScrollable: false);
+			else if (property == ScrollPatternIdentifiers.HorizontalScrollPercentProperty)
+				return (TryGetCurrentPattern (ScrollPatternIdentifiers.Pattern, out pattern)? ((ScrollPattern)pattern).Source.HorizontalScrollPercent: 0);
+			else if (property == ScrollPatternIdentifiers.HorizontalViewSizeProperty)
+				return (TryGetCurrentPattern (ScrollPatternIdentifiers.Pattern, out pattern)? ((ScrollPattern)pattern).Source.HorizontalViewSize: 100);
+			else if (property == ScrollPatternIdentifiers.VerticallyScrollableProperty)
+				return (TryGetCurrentPattern (ScrollPatternIdentifiers.Pattern, out pattern)? ((ScrollPattern)pattern).Source.VerticallyScrollable: false);
+			else if (property == ScrollPatternIdentifiers.VerticalScrollPercentProperty)
+				return (TryGetCurrentPattern (ScrollPatternIdentifiers.Pattern, out pattern)? ((ScrollPattern)pattern).Source.VerticalScrollPercent: 0);
+			else if (property == ScrollPatternIdentifiers.VerticalViewSizeProperty)
+				return (TryGetCurrentPattern (ScrollPatternIdentifiers.Pattern, out pattern)? ((ScrollPattern)pattern).Source.VerticalViewSize: 100);
+			else if (property == SelectionItemPatternIdentifiers.IsSelectedProperty)
+				return (TryGetCurrentPattern (SelectionItemPatternIdentifiers.Pattern, out pattern)? ((SelectionItemPattern)pattern).Source.IsSelected: false);
+			else if (property == SelectionItemPatternIdentifiers.SelectionContainerProperty)
+				return (TryGetCurrentPattern (SelectionItemPatternIdentifiers.Pattern, out pattern)? SourceManager.GetOrCreateAutomationElement (((SelectionItemPattern)pattern).Source.SelectionContainer): null);
+			else if (property == SelectionPatternIdentifiers.CanSelectMultipleProperty)
+				return (TryGetCurrentPattern (SelectionPatternIdentifiers.Pattern, out pattern)? ((SelectionPattern)pattern).Source.CanSelectMultiple: false);
+			else if (property == SelectionPatternIdentifiers.IsSelectionRequiredProperty)
+				return (TryGetCurrentPattern (SelectionPatternIdentifiers.Pattern, out pattern)? ((SelectionPattern)pattern).Source.IsSelectionRequired: false);
+			else if (property == SelectionPatternIdentifiers.SelectionProperty)
+				return (TryGetCurrentPattern (SelectionPatternIdentifiers.Pattern, out pattern)? SourceManager.GetOrCreateAutomationElements (((SelectionPattern)pattern).Source.GetSelection ()): new AutomationElement [0]);
+			else if (property == TableItemPatternIdentifiers.ColumnHeaderItemsProperty)
+				return (TryGetCurrentPattern (TableItemPatternIdentifiers.Pattern, out pattern)? SourceManager.GetOrCreateAutomationElements (((TableItemPattern)pattern).Source.GetColumnHeaderItems ()): new AutomationElement [0]);
+			else if (property == TableItemPatternIdentifiers.RowHeaderItemsProperty)
+				return (TryGetCurrentPattern (TableItemPatternIdentifiers.Pattern, out pattern)? SourceManager.GetOrCreateAutomationElements (((TableItemPattern)pattern).Source.GetRowHeaderItems ()): new AutomationElement [0]);
+			else if (property == TablePatternIdentifiers.ColumnHeadersProperty)
+				return (TryGetCurrentPattern (TablePatternIdentifiers.Pattern, out pattern)? SourceManager.GetOrCreateAutomationElements (((TablePattern)pattern).Source.GetColumnHeaders ()): new AutomationElement [0]);
+			else if (property == TablePatternIdentifiers.RowHeadersProperty)
+				return (TryGetCurrentPattern (TablePatternIdentifiers.Pattern, out pattern)? SourceManager.GetOrCreateAutomationElements (((TablePattern)pattern).Source.GetRowHeaders ()): new AutomationElement [0]);
+			else if (property == TablePatternIdentifiers.RowOrColumnMajorProperty)
+				return (TryGetCurrentPattern (TablePatternIdentifiers.Pattern, out pattern)? ((TablePattern)pattern).Source.RowOrColumnMajor: RowOrColumnMajor.Indeterminate);
+			else if (property == TogglePatternIdentifiers.ToggleStateProperty)
+				return (TryGetCurrentPattern (TogglePatternIdentifiers.Pattern, out pattern)? ((TogglePattern)pattern).Source.ToggleState: ToggleState.Indeterminate);
+			else if (property == TransformPatternIdentifiers.CanMoveProperty)
+				return (TryGetCurrentPattern (TransformPatternIdentifiers.Pattern, out pattern)? (bool)((TransformPattern)pattern).Source.CanMove: false);
+			else if (property == TransformPatternIdentifiers.CanResizeProperty)
+				return (TryGetCurrentPattern (TransformPatternIdentifiers.Pattern, out pattern)? ((TransformPattern)pattern).Source.CanResize: false);
+			else if (property == TransformPatternIdentifiers.CanRotateProperty)
+				return (TryGetCurrentPattern (TransformPatternIdentifiers.Pattern, out pattern)? ((TransformPattern)pattern).Source.CanRotate: false);
+			else if (property == ValuePatternIdentifiers.IsReadOnlyProperty)
+				return (TryGetCurrentPattern (ValuePatternIdentifiers.Pattern, out pattern)? ((ValuePattern)pattern).Source.IsReadOnly: true);
+			else if (property == ValuePatternIdentifiers.ValueProperty)
+				return (TryGetCurrentPattern (ValuePatternIdentifiers.Pattern, out pattern)? ((ValuePattern)pattern).Source.Value: String.Empty);
+			else if (property == WindowPatternIdentifiers.CanMaximizeProperty)
+				return (TryGetCurrentPattern (WindowPatternIdentifiers.Pattern, out pattern)? (bool)((WindowPattern)pattern).Source.CanMaximize: false);
+			else if (property == WindowPatternIdentifiers.CanMinimizeProperty)
+				return (TryGetCurrentPattern (WindowPatternIdentifiers.Pattern, out pattern)? (bool)((WindowPattern)pattern).Source.CanMinimize: false);
+			else if (property == WindowPatternIdentifiers.IsModalProperty)
+				return (TryGetCurrentPattern (WindowPatternIdentifiers.Pattern, out pattern)? ((WindowPattern)pattern).Source.IsModal: false);
+			else if (property == WindowPatternIdentifiers.IsTopmostProperty)
+				return (TryGetCurrentPattern (WindowPatternIdentifiers.Pattern, out pattern)? ((WindowPattern)pattern).Source.IsTopmost: false);
+			else if (property == WindowPatternIdentifiers.WindowInteractionStateProperty)
+				return (TryGetCurrentPattern (WindowPatternIdentifiers.Pattern, out pattern)? ((WindowPattern)pattern).Source.WindowInteractionState: WindowInteractionState.Running);
+			else if (property == WindowPatternIdentifiers.WindowVisualStateProperty)
+				return (TryGetCurrentPattern (WindowPatternIdentifiers.Pattern, out pattern)? ((WindowPattern)pattern).Source.WindowVisualState: WindowVisualState.Normal);
+			Log.Debug ("GetCurrentPropertyValue not implemented for: " + property.ProgrammaticName);
+			return NotSupported;
+		}
+
+		public int [] GetRuntimeId ()
 		{
-			throw new NotImplementedException ();
+			return sourceElement.RuntimeId;
 		}
 
-		public AutomationPattern[] GetSupportedPatterns ()
+		public AutomationPattern [] GetSupportedPatterns ()
 		{
-			throw new NotImplementedException ();
+			return sourceElement.GetSupportedPatterns ();
 		}
 
-		public AutomationProperty[] GetSupportedProperties ()
+		public AutomationProperty [] GetSupportedProperties ()
 		{
-			throw new NotImplementedException ();
+			return sourceElement.GetSupportedProperties ();
 		}
 
 		public AutomationElement GetUpdatedCache (CacheRequest request)
 		{
-			throw new NotImplementedException ();
+			if (request == null)
+				throw new ArgumentNullException ("request");
+
+			var updated = SourceManager.GetOrCreateAutomationElement (sourceElement);
+			if (request == CacheRequest.DefaultRequest)
+				return updated;
+
+			if ((request.TreeScope & TreeScope.Element) == TreeScope.Element) {
+				foreach (var property in request.CachedProperties) {
+					updated.propertyCache [property.Id ] =
+						new CachedValue (updated.GetCurrentPropertyValue (property),
+						                 updated.sourceElement.SupportsProperty (property));
+				}
+				updated.mode = request.AutomationElementMode;
+				updated.CacheRequest = request.Clone ();
+			}
+
+			if ((request.TreeScope & TreeScope.Children) == TreeScope.Children ||
+			    (request.TreeScope & TreeScope.Descendants) == TreeScope.Descendants) {
+				// Modify scope to make sure children include
+				// themselves, and only include their own
+				// children if specified by original scope
+				var childRequest = request.Clone ();
+				childRequest.TreeScope |= TreeScope.Element;
+				if ((request.TreeScope & TreeScope.Descendants) != TreeScope.Descendants)
+					childRequest.TreeScope ^= TreeScope.Children;
+
+				updated.cachedChildren = new List<AutomationElement> ();
+				var child = TreeWalker.RawViewWalker.GetFirstChild (updated, childRequest);
+				while (child != null) {
+					if (childRequest.TreeFilter.AppliesTo (child)) {
+						child.cachedParent = updated;
+						updated.cachedChildren.Add (child);
+					}
+					child = TreeWalker.RawViewWalker.GetNextSibling (child, childRequest);
+				}
+			}
+
+			return updated;
 		}
 
 		public void SetFocus ()
 		{
-			throw new NotImplementedException ();
+			sourceElement.SetFocus ();
 		}
 
 		public bool TryGetCachedPattern (AutomationPattern pattern,
 		                                 out Object patternObject)
 		{
-			throw new NotImplementedException ();
+			try {
+				patternObject = GetCachedPattern (pattern);
+				return true;
+			} catch (Exception) {
+				patternObject = null;
+				return false;
+			}
 		}
 
 		public bool TryGetClickablePoint (out Point pt)
 		{
-			throw new NotImplementedException ();
+			// TODO: Use this as sentinel value on dbus?
+			pt = new Point (double.NegativeInfinity, double.NegativeInfinity);
+			return false;
 		}
 
 		public bool TryGetCurrentPattern (AutomationPattern pattern,
 		                                  out Object patternObject)
 		{
-			throw new NotImplementedException ();
+			try {
+				patternObject = GetCurrentPattern (pattern);
+				return true;
+			} catch (Exception) {
+				patternObject = null;
+				return false;
+			}
 		}
 #endregion
 
 #region Public Static Methods
 		public static AutomationElement FromHandle (IntPtr hwnd)
 		{
-			throw new NotImplementedException ();
+			if (hwnd == (IntPtr) null || hwnd == IntPtr.Zero)
+				throw new ArgumentException ("hwnd");
+			if (hwnd == NativeMethods.RootWindowHandle)
+				return RootElement;
+			AutomationElement element = null;
+			foreach (var source in SourceManager.GetAutomationSources ()) {
+				var sourceElement = source.GetElementFromHandle (hwnd);
+				if (sourceElement != null) {
+					element = SourceManager.GetOrCreateAutomationElement (sourceElement);
+					break;
+				}
+			}
+			if (element == null)
+				throw new ElementNotAvailableException ();
+			return element;
 		}
 
 		public static AutomationElement FromLocalProvider (IRawElementProviderSimple localImpl)
@@ -178,121 +547,268 @@ namespace System.Windows.Automation
 
 		public static AutomationElement FromPoint (Point pt)
 		{
-			throw new NotImplementedException ();
+			IntPtr handle = NativeMethods.WindowAtPosition ((int) pt.X, (int) pt.Y);
+			if (handle == IntPtr.Zero)
+				return RootElement;
+			AutomationElement startElement = FromHandle (handle);
+			if (startElement == RootElement)
+				return RootElement;
+			//Keep searching the descendant element which are not native window
+			var sourceElement = startElement.SourceElement.
+				GetDescendantFromPoint (pt.X, pt.Y);
+			return SourceManager.GetOrCreateAutomationElement (sourceElement);
 		}
 
 		public static bool operator == (AutomationElement left,
 		                                AutomationElement right)
 		{
-			throw new NotImplementedException ();
+			return object.Equals (left, right);
 		}
 
 		public static bool operator != (AutomationElement left,
 		                                AutomationElement right)
 		{
-			throw new NotImplementedException ();
+			return !(left == right);
 		}
 #endregion
 
-#region public structures
-		public struct AutomationElementInformation
+#region Internal Methods
+		internal object GetPropertyValue (AutomationProperty property,
+		                                  bool cached)
 		{
-			public string AcceleratorKey {
-				get { throw new NotImplementedException (); }
-			}
+			if (cached)
+				return GetCachedPropertyValue (property);
+			else
+				return GetCurrentPropertyValue (property);
+		}
+#endregion
 
-			public string AccessKey {
-				get { throw new NotImplementedException (); }
+#region Private Methods
+		private Object GetPattern (AutomationPattern pattern, bool cached)
+		{
+			if (pattern == null)
+				throw new ArgumentNullException ("pattern");
+			if (cached && (CacheRequest == null || !CacheRequest.CachedPatterns.Contains (pattern)))
+				throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+			object source = sourceElement.GetCurrentPattern (pattern);
+			if (source == null)
+				throw new InvalidOperationException ("Cannot request an unsupported pattern");
+
+			if (pattern == DockPatternIdentifiers.Pattern)
+				return new DockPattern ((IDockProvider) source, this, cached);
+			else if (pattern == ExpandCollapsePatternIdentifiers.Pattern)
+				return new ExpandCollapsePattern ((IExpandCollapseProvider) source, this, cached);
+			else if (pattern == GridItemPatternIdentifiers.Pattern)
+				return new GridItemPattern ((IGridItemPattern) source, this, cached);
+			else if (pattern == GridPatternIdentifiers.Pattern)
+				return new GridPattern ((IGridPattern) source, this, cached);
+			else if (pattern == InvokePatternIdentifiers.Pattern)
+				return new InvokePattern ((IInvokePattern) source);
+			else if (pattern == MultipleViewPatternIdentifiers.Pattern)
+				return new MultipleViewPattern ((IMultipleViewPattern) source, this, cached);
+			else if (pattern == RangeValuePatternIdentifiers.Pattern)
+				return new RangeValuePattern ((IRangeValuePattern) source, this, cached);
+			else if (pattern == ScrollItemPatternIdentifiers.Pattern)
+				return new ScrollItemPattern ((IScrollItemProvider) source);
+			else if (pattern == ScrollPatternIdentifiers.Pattern)
+				return new ScrollPattern ((IScrollPattern) source, this, cached);
+			else if (pattern == SelectionItemPatternIdentifiers.Pattern)
+				return new SelectionItemPattern ((ISelectionItemPattern) source, this, cached);
+			else if (pattern == SelectionPatternIdentifiers.Pattern)
+				return new SelectionPattern ((ISelectionPattern) source, this, cached);
+			else if (pattern == TableItemPatternIdentifiers.Pattern)
+				return new TableItemPattern ((ITableItemPattern) source, this, cached);
+			else if (pattern == TablePatternIdentifiers.Pattern)
+				return new TablePattern ((ITablePattern) source, this, cached);
+			else if (pattern == TextPatternIdentifiers.Pattern)
+				return new TextPattern ((ITextPattern) source);
+			else if (pattern == TogglePatternIdentifiers.Pattern)
+				return new TogglePattern ((IToggleProvider) source, this, cached);
+			else if (pattern == TransformPatternIdentifiers.Pattern)
+				return new TransformPattern ((ITransformPattern) source, this, cached);
+			else if (pattern == ValuePatternIdentifiers.Pattern)
+				return new ValuePattern ((IValuePattern) source, this, cached);
+			else if (pattern == WindowPatternIdentifiers.Pattern)
+				return new WindowPattern ((IWindowPattern) source, this, cached);
+			else
+				throw new ArgumentException ();
+		}
+
+		private List<AutomationElement> Find (TreeScope scope, Condition condition, bool findFirst)
+		{
+			// Parent and Ancestors scopes are not supported on
+			// Windows (this is specified in MSDN, too).
+			if ((scope & TreeScope.Parent) == TreeScope.Parent ||
+			    (scope & TreeScope.Ancestors) == TreeScope.Ancestors)
+				throw new ArgumentException ("scope");
+
+			List<AutomationElement> found = new List<AutomationElement> ();
+
+			if ((!findFirst || found.Count == 0) &&
+			    (scope & TreeScope.Element) == TreeScope.Element &&
+			    condition.AppliesTo (this) &&
+			    (CacheRequest.Current == CacheRequest.DefaultRequest || CacheRequest.Current.TreeFilter.AppliesTo (this))) {
+				// TODO: Need to check request's TreeScope, too?
+				found.Add (GetUpdatedCache (CacheRequest.Current));
 			}
 
-			public string AutomationId {
-				get { throw new NotImplementedException (); }
+			if ((!findFirst || found.Count == 0) &&
+			    ((scope & TreeScope.Children) == TreeScope.Children ||
+			    (scope & TreeScope.Descendants) == TreeScope.Descendants)) {
+				TreeScope childScope = TreeScope.Element;
+				if ((scope & TreeScope.Descendants) == TreeScope.Descendants)
+					childScope = TreeScope.Subtree;
+				AutomationElement current =
+					TreeWalker.RawViewWalker.GetFirstChild (this);
+				while (current != null) {
+					//Log.Debug ("Inspecting child: " + current.Current.Name);
+					found.AddRange (current.Find (childScope, condition, findFirst));
+					if (findFirst && found.Count > 0)
+						break;
+					current = TreeWalker.RawViewWalker.GetNextSibling (current);
+				}
 			}
 
-			public Rect BoundingRectangle {
-				get { throw new NotImplementedException (); }
-			}
+			return found;
+		}
 
-			public string ClassName {
-				get { throw new NotImplementedException (); }
-			}
+//		private static string PrintRuntimeId (int [] runtimeId)
+//		{
+//			string output = "{";
+//			for (int i = 0; i < runtimeId.Length; i++) {
+//				output += runtimeId [i].ToString ();
+//				if ((i+1) < runtimeId.Length)
+//					output += ",";
+//			}
+//			return output + "}";
+//		}
 
-			public ControlType ControlType {
-				get { throw new NotImplementedException (); }
-			}
+		class CachedValue
+		{
+			public bool IsSupported { get; private set; }
 
-			public string FrameworkId {
-				get { throw new NotImplementedException (); }
-			}
+			public Object Value { get; private set; }
 
-			public bool HasKeyboardFocus {
-				get { throw new NotImplementedException (); }
+			public CachedValue (object val, bool isSupported)
+			{
+				Value = val;
+				IsSupported = isSupported;
 			}
+		}
+#endregion
 
-			public string HelpText {
-				get { throw new NotImplementedException (); }
-			}
+#region Public Static ReadOnly Fields
 
-			public bool IsContentElement {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly Object NotSupported = AEIds.NotSupported;
 
-			public bool IsControlElement {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty AcceleratorKeyProperty = AEIds.AcceleratorKeyProperty;
 
-			public bool IsEnabled {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty AccessKeyProperty = AEIds.AccessKeyProperty;
 
-			public bool IsKeyboardFocusable {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty AutomationIdProperty = AEIds.AutomationIdProperty;
 
-			public bool IsOffscreen {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty BoundingRectangleProperty = AEIds.BoundingRectangleProperty;
 
-			public bool IsPassword {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty ClassNameProperty = AEIds.ClassNameProperty;
 
-			public bool IsRequiredForm {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty ClickablePointProperty = AEIds.ClickablePointProperty;
 
-			public string ItemStatus {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty ControlTypeProperty = AEIds.ControlTypeProperty;
 
-			public string ItemType {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty CultureProperty = AEIds.CultureProperty;
 
-			public AutomationElement LabeledBy {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty FrameworkIdProperty = AEIds.FrameworkIdProperty;
 
-			public string LocalizedControlType {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty HasKeyboardFocusProperty = AEIds.HasKeyboardFocusProperty;
 
-			public string Name {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty HelpTextProperty = AEIds.HelpTextProperty;
 
-			public IntPtr NativeWindowHandle {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty IsContentElementProperty = AEIds.IsContentElementProperty;
 
-			public OrientationType Orientation {
-				get { throw new NotImplementedException (); }
-			}
+		public static readonly AutomationProperty IsControlElementProperty = AEIds.IsControlElementProperty;
+
+		public static readonly AutomationProperty IsDockPatternAvailableProperty = AEIds.IsDockPatternAvailableProperty;
+
+		public static readonly AutomationProperty IsEnabledProperty = AEIds.IsEnabledProperty;
+
+		public static readonly AutomationProperty IsExpandCollapsePatternAvailableProperty = AEIds.IsExpandCollapsePatternAvailableProperty;
+
+		public static readonly AutomationProperty IsGridItemPatternAvailableProperty = AEIds.IsGridItemPatternAvailableProperty;
+
+		public static readonly AutomationProperty IsGridPatternAvailableProperty = AEIds.IsGridPatternAvailableProperty;
+
+		public static readonly AutomationProperty IsInvokePatternAvailableProperty = AEIds.IsInvokePatternAvailableProperty;
+
+		public static readonly AutomationProperty IsKeyboardFocusableProperty = AEIds.IsKeyboardFocusableProperty;
+
+		public static readonly AutomationProperty IsMultipleViewPatternAvailableProperty = AEIds.IsMultipleViewPatternAvailableProperty;
+
+		public static readonly AutomationProperty IsOffscreenProperty = AEIds.IsOffscreenProperty;
+
+		public static readonly AutomationProperty IsPasswordProperty = AEIds.IsPasswordProperty;
+
+		public static readonly AutomationProperty IsRangeValuePatternAvailableProperty = AEIds.IsRangeValuePatternAvailableProperty;
+
+		public static readonly AutomationProperty IsRequiredForFormProperty = AEIds.IsRequiredForFormProperty;
+
+		public static readonly AutomationProperty IsScrollItemPatternAvailableProperty = AEIds.IsScrollItemPatternAvailableProperty;
+
+		public static readonly AutomationProperty IsScrollPatternAvailableProperty = AEIds.IsScrollPatternAvailableProperty;
+
+		public static readonly AutomationProperty IsSelectionItemPatternAvailableProperty = AEIds.IsSelectionItemPatternAvailableProperty;
+
+		public static readonly AutomationProperty IsSelectionPatternAvailableProperty = AEIds.IsSelectionPatternAvailableProperty;
+
+		public static readonly AutomationProperty IsTableItemPatternAvailableProperty = AEIds.IsTableItemPatternAvailableProperty;
+
+		public static readonly AutomationProperty IsTablePatternAvailableProperty = AEIds.IsTablePatternAvailableProperty;
+
+		public static readonly AutomationProperty IsTextPatternAvailableProperty = AEIds.IsTextPatternAvailableProperty;
+
+		public static readonly AutomationProperty IsTogglePatternAvailableProperty = AEIds.IsTogglePatternAvailableProperty;
+
+		public static readonly AutomationProperty IsTransformPatternAvailableProperty = AEIds.IsTransformPatternAvailableProperty;
+
+		public static readonly AutomationProperty IsValuePatternAvailableProperty = AEIds.IsValuePatternAvailableProperty;
+
+		public static readonly AutomationProperty IsWindowPatternAvailableProperty = AEIds.IsWindowPatternAvailableProperty;
+
+		public static readonly AutomationProperty ItemStatusProperty = AEIds.ItemStatusProperty;
+
+		public static readonly AutomationProperty ItemTypeProperty = AEIds.ItemTypeProperty;
+
+		public static readonly AutomationProperty LabeledByProperty = AEIds.LabeledByProperty;
+
+		public static readonly AutomationProperty LocalizedControlTypeProperty = AEIds.LocalizedControlTypeProperty;
+
+		public static readonly AutomationProperty NameProperty = AEIds.NameProperty;
+
+		public static readonly AutomationProperty NativeWindowHandleProperty = AEIds.NativeWindowHandleProperty;
+
+		public static readonly AutomationProperty OrientationProperty = AEIds.OrientationProperty;
+
+		public static readonly AutomationProperty ProcessIdProperty = AEIds.ProcessIdProperty;
+
+		public static readonly AutomationProperty RuntimeIdProperty = AEIds.RuntimeIdProperty;
+
+		public static readonly AutomationEvent AsyncContentLoadedEvent = AEIds.AsyncContentLoadedEvent;
+
+		public static readonly AutomationEvent AutomationFocusChangedEvent = AEIds.AutomationFocusChangedEvent;
+
+		public static readonly AutomationEvent AutomationPropertyChangedEvent = AEIds.AutomationPropertyChangedEvent;
+
+		public static readonly AutomationEvent LayoutInvalidatedEvent = AEIds.LayoutInvalidatedEvent;
+
+		public static readonly AutomationEvent MenuClosedEvent = AEIds.MenuClosedEvent;
+
+		public static readonly AutomationEvent MenuOpenedEvent = AEIds.MenuOpenedEvent;
+
+		public static readonly AutomationEvent StructureChangedEvent = AEIds.StructureChangedEvent;
+
+		public static readonly AutomationEvent ToolTipClosedEvent = AEIds.ToolTipClosedEvent;
+
+		public static readonly AutomationEvent ToolTipOpenedEvent = AEIds.ToolTipOpenedEvent;
 
-			public int ProcessId {
-				get { throw new NotImplementedException (); }
-			}
-		}
 #endregion
 	}
 }
diff --git a/UIAutomationClient/System.Windows.Automation/AutomationElementCollection.cs b/UIAutomationClient/System.Windows.Automation/AutomationElementCollection.cs
index 59718df..099b599 100644
--- a/UIAutomationClient/System.Windows.Automation/AutomationElementCollection.cs
+++ b/UIAutomationClient/System.Windows.Automation/AutomationElementCollection.cs
@@ -21,55 +21,61 @@
 // 
 // Authors: 
 //      Brad Taylor <brad at getcoded.net>
+//      Sandy Armstrong <sanfordarmstrong at gmail.com>
 // 
 
 using System;
 using System.Collections;
+using System.Collections.Generic;
 
 namespace System.Windows.Automation
 {
 	public class AutomationElementCollection : ICollection, IEnumerable
 	{
+#region Private Fields
+		private List<AutomationElement> elements;
+#endregion
+
 #region Public Properties
 		public int Count {
-			get { throw new NotImplementedException (); }
+			get { return elements.Count; }
 		}
 
-		public bool IsSynchronized {
-			get { throw new NotImplementedException (); }
+		public virtual bool IsSynchronized {
+			get { return ((ICollection) elements).IsSynchronized; }
 		}
 
 		public AutomationElement this [int index] {
-			get { throw new NotImplementedException (); }
+			get { return elements [index]; }
 		}
 
 		public virtual object SyncRoot {
-			get { throw new NotImplementedException (); }
+			get { return ((ICollection) elements).SyncRoot; }
 		}
 #endregion
 
 #region Constructor
-		private AutomationElementCollection ()
+		internal AutomationElementCollection (IEnumerable<AutomationElement> elements)
 		{
+			this.elements = new List<AutomationElement> (elements);
 		}
 #endregion
-		
+
 #region Public Methods
 		public virtual void CopyTo (Array array, int index)
 		{
-			throw new NotImplementedException ();
+			((ICollection) elements).CopyTo (array, index);
 		}
 
 		public void CopyTo (AutomationElement[] array, int index)
 		{
-			throw new NotImplementedException ();
+			elements.CopyTo (array, index);
 		}
 
 		public IEnumerator GetEnumerator ()
 		{
-			throw new NotImplementedException ();
+			return elements.GetEnumerator ();
 		}
-
 #endregion
 	}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/ClipboardPatternIdentifiers.cs b/UIAutomationClient/System.Windows.Automation/AutomationFocusChangedEventArgs.cs
similarity index 66%
copy from UIAutomationTypes/System.Windows.Automation/ClipboardPatternIdentifiers.cs
copy to UIAutomationClient/System.Windows.Automation/AutomationFocusChangedEventArgs.cs
index c448db7..36fff30 100644
--- a/UIAutomationTypes/System.Windows.Automation/ClipboardPatternIdentifiers.cs
+++ b/UIAutomationClient/System.Windows.Automation/AutomationFocusChangedEventArgs.cs
@@ -20,31 +20,38 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
 // 
+
 using System;
 
 namespace System.Windows.Automation
 {
-	internal static class ClipboardPatternIdentifiers
+	public delegate void AutomationFocusChangedEventHandler (Object sender,
+	                                                         AutomationFocusChangedEventArgs e);
+
+	public class AutomationFocusChangedEventArgs : AutomationEventArgs
 	{
-		#region Constructor
-		
-		private const int PatternId = 70004;
-		
-		static ClipboardPatternIdentifiers ()
+		int idObject;
+		int idChild;
+
+		public AutomationFocusChangedEventArgs (int idObject, int idChild) :
+			base (AutomationElementIdentifiers.AutomationFocusChangedEvent)
 		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "ClipboardPatternIdentifiers.Pattern");
+			this.idObject = idObject;
+			this.idChild = idChild;
+		}
+
+		public int ObjectId {
+			get {
+				return idObject;
+			}
+		}
+
+		public int ChildId {
+			get {
+				return idChild;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
 	}
 }
diff --git a/UIAutomationClient/System.Windows.Automation/BasePattern.cs b/UIAutomationClient/System.Windows.Automation/BasePattern.cs
index 9aa1f24..61e1d04 100644
--- a/UIAutomationClient/System.Windows.Automation/BasePattern.cs
+++ b/UIAutomationClient/System.Windows.Automation/BasePattern.cs
@@ -29,6 +29,8 @@ namespace System.Windows.Automation
 {
 	public class BasePattern
 	{
-		// Yes, this is an intentionally empty class.
+		internal BasePattern ()
+		{
+		}
 	}
 }
diff --git a/UIAutomationProvider/System.Windows.Automation.Provider/IInsertDeleteTextProvider.cs b/UIAutomationClient/System.Windows.Automation/BoolCondition.cs
similarity index 80%
copy from UIAutomationProvider/System.Windows.Automation.Provider/IInsertDeleteTextProvider.cs
copy to UIAutomationClient/System.Windows.Automation/BoolCondition.cs
index 02f2a35..1634599 100644
--- a/UIAutomationProvider/System.Windows.Automation.Provider/IInsertDeleteTextProvider.cs
+++ b/UIAutomationClient/System.Windows.Automation/BoolCondition.cs
@@ -20,18 +20,25 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//      Brad Taylor <brad at getcoded.net>
+//      Sandy Armstrong <sanfordarmstrong at gmail.com>
 // 
 
 using System;
-using System.Windows;
 
-namespace System.Windows.Automation.Provider
+namespace System.Windows.Automation
 {
-	internal interface IInsertDeleteTextProvider
+	internal class BoolCondition : Condition
 	{
-		void InsertText (string str, ref int position);
+		private bool val;
 
-		void DeleteText (int start, int end);
+		internal BoolCondition (bool val)
+		{
+			this.val = val;
+		}
+
+		internal override bool AppliesTo (AutomationElement element)
+		{
+			return val;
+		}
 	}
 }
diff --git a/UIAutomationClient/System.Windows.Automation/CacheRequest.cs b/UIAutomationClient/System.Windows.Automation/CacheRequest.cs
index ffaebf2..b8ce362 100644
--- a/UIAutomationClient/System.Windows.Automation/CacheRequest.cs
+++ b/UIAutomationClient/System.Windows.Automation/CacheRequest.cs
@@ -24,68 +24,195 @@
 // 
 
 using System;
+using System.Collections.Generic;
+using System.Threading;
 
 namespace System.Windows.Automation
 {
 	public sealed class CacheRequest
 	{
+#region Private Fields
+		private List<RequestToken> disposables =
+			new List<RequestToken> ();
+		private List<AutomationPattern> cachedPatterns =
+			new List<AutomationPattern> ();
+		private List<AutomationProperty> cachedProperties =
+			new List<AutomationProperty> ();
+		private AutomationElementMode mode;
+		private Condition treeFilter;
+		private TreeScope scope;
+#endregion
+
 #region Public Properties
 		public AutomationElementMode AutomationElementMode {
-			get { throw new NotImplementedException (); }
-			set { throw new NotImplementedException (); }
+			get { return mode; }
+			set {
+				if (IsContainedInAnyThreadStack ())
+					throw new InvalidOperationException ("Cannot modify a CacheRequest that is already on the stack");
+				mode = value;
+			}
 		}
 
 		public Condition TreeFilter {
-			get { throw new NotImplementedException (); }
-			set { throw new NotImplementedException (); }
+			get { return treeFilter; }
+			set {
+				if (IsContainedInAnyThreadStack ())
+					throw new InvalidOperationException ("Cannot modify a CacheRequest that is already on the stack");
+				treeFilter = value;
+			}
 		}
 
 		public TreeScope TreeScope {
-			get { throw new NotImplementedException (); }
+			get { return scope; }
+			set {
+				if ((value & TreeScope.Ancestors) == TreeScope.Ancestors ||
+				    (value & TreeScope.Parent) == TreeScope.Parent)
+					throw new ArgumentException ("TreeScope.Ancestors and TreeScope.Parent are invalid for CacheRequest.TreeScope");
+				if (IsContainedInAnyThreadStack ())
+					throw new InvalidOperationException ("Cannot modify a CacheRequest that is already on the stack");
+				scope = value;
+			}
 		}
 #endregion
 
 #region Public Static Properties
 		public static CacheRequest Current {
-			get { throw new NotImplementedException (); }
+			get {
+				var requestStack = GetCurrentStack ();
+				return requestStack.Peek (); // NOTE: We guarantee non-empty stack
+			}
+		}
+#endregion
+
+#region Internal Properties
+		internal IList<AutomationProperty> CachedProperties {
+			get { return cachedProperties; }
+		}
+
+		internal IList<AutomationPattern> CachedPatterns {
+			get { return cachedPatterns; }
 		}
 #endregion
 
 #region Constructor
 		public CacheRequest ()
 		{
+			mode = AutomationElementMode.Full;
+			treeFilter = Automation.ControlViewCondition;
+			scope = TreeScope.Element;
 		}
 #endregion
-		
+
 #region Public Methods
 		public IDisposable Activate ()
 		{
-			throw new NotImplementedException ();
+			var requestStack = GetCurrentStack ();
+			RequestToken disposable = new RequestToken (this);
+			disposables.Add (disposable);
+			requestStack.Push (this);
+			return disposable;
 		}
 
 		public void Add (AutomationPattern pattern)
 		{
-			throw new NotImplementedException ();
+			if (pattern == null)
+				throw new ArgumentNullException ("pattern");
+			if (IsContainedInAnyThreadStack ())
+				throw new InvalidOperationException ("Cannot modify an active CacheRequest");
+			cachedPatterns.Add (pattern);
 		}
 
 		public void Add (AutomationProperty property)
 		{
-			throw new NotImplementedException ();
+			if (property == null)
+				throw new ArgumentNullException ("property");
+			if (IsContainedInAnyThreadStack ())
+				throw new InvalidOperationException ("Cannot modify an active CacheRequest");
+			cachedProperties.Add (property);
 		}
 
 		public CacheRequest Clone ()
 		{
-			throw new NotImplementedException ();
+			var clone = new CacheRequest ();
+			clone.TreeFilter = TreeFilter;
+			clone.TreeScope = TreeScope;
+			clone.AutomationElementMode = AutomationElementMode;
+
+			clone.cachedPatterns.AddRange (cachedPatterns);
+			clone.cachedProperties.AddRange (cachedProperties);
+
+			return clone;
 		}
 
 		public void Pop ()
 		{
-			throw new NotImplementedException ();
+			var requestStack = GetCurrentStack ();
+			if (requestStack.Peek () != this ||
+			    this == DefaultRequest)
+				throw new InvalidOperationException ("Can only pop CacheRequest.Current");
+			requestStack.Pop ();
 		}
 
 		public void Push ()
 		{
-			throw new NotImplementedException ();
+			var requestStack = GetCurrentStack ();
+			requestStack.Push (this);
+		}
+#endregion
+
+#region Private Static Members
+		private static Dictionary<Thread, Stack<CacheRequest>> requestStacks =
+			new Dictionary<Thread, Stack<CacheRequest>> ();
+		internal static readonly CacheRequest DefaultRequest =
+			new CacheRequest ();
+		static Object stackLock = new Object ();
+
+		static Stack<CacheRequest> GetCurrentStack ()
+		{
+			Stack<CacheRequest> requestStack;
+			if (!requestStacks.TryGetValue (Thread.CurrentThread, out requestStack)) {
+				lock (stackLock) {
+					if (!requestStacks.TryGetValue (Thread.CurrentThread, out requestStack)) {
+						requestStack = new Stack<CacheRequest> ();
+						requestStack.Push (DefaultRequest);
+						requestStacks [Thread.CurrentThread] = requestStack;
+					}
+				}
+			}
+			return requestStack;
+		}
+#endregion
+
+#region Private Methods
+		private bool IsContainedInAnyThreadStack ()
+		{
+			lock (stackLock) {
+				foreach (var stack in requestStacks.Values)
+					if (stack.Contains (this))
+						return true;
+			}
+			return false;
+		}
+#endregion
+
+#region Private Disposable RequestToken Class
+		private class RequestToken : IDisposable
+		{
+			private CacheRequest request;
+
+			public RequestToken (CacheRequest request)
+			{
+				this.request = request;
+			}
+
+			public void Dispose ()
+			{
+				if (request.disposables.Count != 0) {
+				    //request.disposables.Peek () == this) {
+					request.disposables.Remove (this);
+					request.Pop ();
+				}
+			}
 		}
 #endregion
 	}
diff --git a/UIAutomationClient/System.Windows.Automation/ClientSettings.cs b/UIAutomationClient/System.Windows.Automation/ClientSettings.cs
new file mode 100644
index 0000000..2ea3aca
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/ClientSettings.cs
@@ -0,0 +1,72 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2010 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//      Matt Guo <matt at mattguo.com>
+// 
+
+using System;
+using System.Reflection;
+using System.IO;
+
+namespace System.Windows.Automation
+{
+	public static class ClientSettings
+	{
+		public static void RegisterClientSideProviderAssembly (AssemblyName assemblyName)
+		{
+			if (assemblyName == null)
+				throw new ArgumentNullException ("assemblyName");
+
+			Assembly assembly = null;
+			// TODO, wrap exception messages into Catalog.GetString
+			try {
+				assembly = Assembly.Load (assemblyName);
+			} catch (FileNotFoundException) {
+				throw new ProxyAssemblyNotLoadedException (
+					string.Format ("'{0}' assembly not found.", assemblyName));
+			}
+
+			string typeName = assemblyName.Name + ".UIAutomationClientSideProviders";
+			Type type = assembly.GetType(typeName);
+			if (type == null)
+				throw new ProxyAssemblyNotLoadedException (
+					string.Format ("Cannot find type {0} in assembly {1}",
+						typeName, assemblyName));
+
+			FieldInfo field = type.GetField("ClientSideProviderDescriptionTable", BindingFlags.Public | BindingFlags.Static);
+			if ((field == null) || (field.FieldType != typeof(ClientSideProviderDescription[])))
+				throw new ProxyAssemblyNotLoadedException (
+					string.Format ("Cannot find Register method on type {0} in assembly {1}",
+						typeName, assemblyName));
+
+			var description = field.GetValue(null) as ClientSideProviderDescription [];
+			if (description != null)
+				ClientSettings.RegisterClientSideProviders (description);
+		}
+
+		public static void RegisterClientSideProviders (
+			ClientSideProviderDescription [] clientSideProviderDescription)
+		{
+			throw new NotImplementedException ();
+		}
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/ClientSideProviderDescription.cs b/UIAutomationClient/System.Windows.Automation/ClientSideProviderDescription.cs
new file mode 100644
index 0000000..ae0a9fc
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/ClientSideProviderDescription.cs
@@ -0,0 +1,68 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2010 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//      Matt Guo <matt at mattguo.com>
+// 
+
+using System;
+using System.Windows.Automation.Provider;
+
+namespace System.Windows.Automation
+{
+	public struct ClientSideProviderDescription
+	{
+		public ClientSideProviderDescription (
+			ClientSideProviderFactoryCallback clientSideProviderFactoryCallback,
+			string className)
+		: this (clientSideProviderFactoryCallback, className,
+			null, ClientSideProviderMatchIndicator.None)
+		{
+		}
+
+		public ClientSideProviderDescription (
+			ClientSideProviderFactoryCallback clientSideProviderFactoryCallback,
+			string className,
+			string imageName,
+			ClientSideProviderMatchIndicator flags)
+		{
+			this.ClientSideProviderFactoryCallback = clientSideProviderFactoryCallback;
+			this.ClassName = className;
+			this.ImageName = imageName;
+			this.Flags = flags;
+		}
+
+		public string ClassName { get; private set; }
+		public ClientSideProviderMatchIndicator Flags { get; private set; }
+		public string ImageName { get; private set; }
+		public ClientSideProviderFactoryCallback ClientSideProviderFactoryCallback { get; private set; }
+	}
+
+	[Flags]
+	public enum ClientSideProviderMatchIndicator
+	{
+		None,
+		AllowSubstringMatch,
+		DisallowBaseClassNameMatch
+	}
+
+	public delegate IRawElementProviderSimple ClientSideProviderFactoryCallback (IntPtr hwnd, int idChild, int idObject);
+}
diff --git a/UIAutomationClient/System.Windows.Automation/Condition.cs b/UIAutomationClient/System.Windows.Automation/Condition.cs
index 210017a..34095bd 100644
--- a/UIAutomationClient/System.Windows.Automation/Condition.cs
+++ b/UIAutomationClient/System.Windows.Automation/Condition.cs
@@ -21,6 +21,7 @@
 // 
 // Authors: 
 //      Brad Taylor <brad at getcoded.net>
+//      Sandy Armstrong <sanfordarmstrong at gmail.com>
 // 
 
 using System;
@@ -29,10 +30,22 @@ namespace System.Windows.Automation
 {
 	public abstract class Condition
 	{
+#region Constructor
+		internal Condition ()
+		{
+		}
+#endregion
+
+#region Internal Abstract Methods
+		internal abstract bool AppliesTo (AutomationElement element);
+#endregion
+
 #region Public Static Fields
-		public static Condition FalseCondition;
+		public static readonly Condition FalseCondition =
+			new BoolCondition (false);
 
-		public static Condition TrueCondition;
+		public static readonly Condition TrueCondition =
+			new BoolCondition (true);
 #endregion
 	}
 }
diff --git a/UIAutomationClient/System.Windows.Automation/DesktopElement.cs b/UIAutomationClient/System.Windows.Automation/DesktopElement.cs
new file mode 100644
index 0000000..0e44e25
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/DesktopElement.cs
@@ -0,0 +1,287 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//      Sandy Armstrong <sanfordarmstrong at gmail.com>
+// 
+
+using System;
+
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	internal class DesktopElement : IElement
+	{
+		#region IElement implementation
+		public bool SupportsProperty (AutomationProperty property)
+		{
+			// TODO: Implement
+			return true;
+		}
+
+		public string AcceleratorKey {
+			get {
+				return string.Empty;
+			}
+		}
+
+		public string AccessKey {
+			get {
+				return string.Empty;
+			}
+		}
+
+		public string AutomationId {
+			get {
+				return string.Empty;
+			}
+		}
+
+		public Rect BoundingRectangle {
+			get {
+				int width, height;
+				NativeMethods.GetScreenBound (out width, out height);
+				return new Rect (0, 0, width, height);
+			}
+		}
+
+		public string ClassName {
+			get {
+				return string.Empty;
+			}
+		}
+
+		public Point ClickablePoint {
+			get {
+				return new Point (double.NegativeInfinity, double.NegativeInfinity);
+			}
+		}
+
+		public ControlType ControlType {
+			get {
+				return ControlType.Pane;
+			}
+		}
+
+		public string FrameworkId {
+			get {
+				return string.Empty;
+			}
+		}
+
+		public bool HasKeyboardFocus {
+			get {
+				return false;
+			}
+		}
+
+		public string HelpText {
+			get {
+				return string.Empty;
+			}
+		}
+
+		public bool IsContentElement {
+			get {
+				return true;
+			}
+		}
+
+		public bool IsControlElement {
+			get {
+				return true;
+			}
+		}
+
+		public bool IsEnabled {
+			get {
+				return true;
+			}
+		}
+
+		public bool IsKeyboardFocusable {
+			get {
+				return false;
+			}
+		}
+
+		public bool IsOffscreen {
+			get {
+				return false;
+			}
+		}
+
+		public bool IsPassword {
+			get {
+				return false;
+			}
+		}
+
+		public bool IsRequiredForForm {
+			get {
+				return false;
+			}
+		}
+
+		public string ItemStatus {
+			get {
+				return string.Empty;
+			}
+		}
+
+		public string ItemType {
+			get {
+				return string.Empty;
+			}
+		}
+
+		public IElement LabeledBy {
+			get {
+				return null;
+			}
+		}
+
+		public string LocalizedControlType {
+			get {
+				return ControlType.LocalizedControlType;
+			}
+		}
+
+		public string Name {
+			get {
+				return string.Empty;
+			}
+		}
+
+		public int NativeWindowHandle {
+			get {
+				return -1;
+			}
+		}
+
+		public OrientationType Orientation {
+			get {
+				return OrientationType.None;
+			}
+		}
+
+		public int ProcessId {
+			get {
+				return -1;
+			}
+		}
+
+		public int[] RuntimeId {
+			get {
+				return new int[0];
+			}
+		}
+
+		public IElement Parent {
+			get {
+				return null;
+			}
+		}
+
+		public IElement FirstChild {
+			get {
+				throw new NotImplementedException ();
+			}
+		}
+
+		public IElement LastChild {
+			get {
+				throw new NotImplementedException ();
+			}
+		}
+
+		public IElement NextSibling {
+			get {
+				return null;
+			}
+		}
+
+		public IElement PreviousSibling {
+			get {
+				return null;
+			}
+		}
+
+		public IAutomationSource AutomationSource {
+			get { return null; }
+		}
+
+		public object GetCurrentPattern (AutomationPattern pattern)
+		{
+			throw new InvalidOperationException ();
+		}
+
+		public AutomationPattern [] GetSupportedPatterns ()
+		{
+			return new AutomationPattern [0];
+		}
+
+		public AutomationProperty [] GetSupportedProperties ()
+		{
+			//TODO need to test whether other properties' values are 'NotSupported'
+			return new AutomationProperty [] {
+				AutomationElementIdentifiers.AcceleratorKeyProperty,
+				AutomationElementIdentifiers.AccessKeyProperty,
+				AutomationElementIdentifiers.AutomationIdProperty,
+				AutomationElementIdentifiers.BoundingRectangleProperty,
+				AutomationElementIdentifiers.ClassNameProperty,
+				AutomationElementIdentifiers.ControlTypeProperty,
+				AutomationElementIdentifiers.FrameworkIdProperty,
+				AutomationElementIdentifiers.HasKeyboardFocusProperty,
+				AutomationElementIdentifiers.HelpTextProperty,
+				AutomationElementIdentifiers.ItemStatusProperty,
+				AutomationElementIdentifiers.ItemTypeProperty,
+				AutomationElementIdentifiers.IsControlElementProperty,
+				AutomationElementIdentifiers.IsContentElementProperty,
+				AutomationElementIdentifiers.IsEnabledProperty,
+				AutomationElementIdentifiers.IsKeyboardFocusableProperty,
+				AutomationElementIdentifiers.IsOffscreenProperty,
+				AutomationElementIdentifiers.IsPasswordProperty,
+				AutomationElementIdentifiers.IsRequiredForFormProperty,
+				AutomationElementIdentifiers.LabeledByProperty,
+				AutomationElementIdentifiers.LocalizedControlTypeProperty,
+				AutomationElementIdentifiers.NameProperty,
+				AutomationElementIdentifiers.OrientationProperty,
+				AutomationElementIdentifiers.ProcessIdProperty,
+				AutomationElementIdentifiers.RuntimeIdProperty
+			};
+		}
+
+		public void SetFocus ()
+		{
+			// TODO: Need to test
+		}
+
+		public IElement GetDescendantFromPoint (double x, double y)
+		{
+			//Root element show have no child element which is not
+			//a native window
+			return this;
+		}
+		#endregion
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/DockPattern.cs b/UIAutomationClient/System.Windows.Automation/DockPattern.cs
new file mode 100644
index 0000000..fdea1e8
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/DockPattern.cs
@@ -0,0 +1,96 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using System.Windows.Automation.Provider;
+
+namespace System.Windows.Automation
+{
+	public class DockPattern : BasePattern
+	{
+		public struct DockPatternInformation
+		{
+			private bool cache;
+			private DockPattern pattern;
+
+			internal DockPatternInformation (DockPattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public DockPosition DockPosition {
+				get { return (DockPosition) pattern.element.GetPropertyValue (DockPositionProperty, cache); }
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private DockPatternInformation currentInfo;
+		private DockPatternInformation cachedInfo;
+
+		internal DockPattern ()
+		{
+		}
+
+		internal DockPattern (IDockProvider source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new DockPatternInformation (this, false);
+			if (cached)
+				cachedInfo = new DockPatternInformation (this, true);
+		}
+
+		internal IDockProvider Source { get; private set; }
+
+		public DockPatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public DockPatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public void SetDockPosition (DockPosition dockPosition)
+		{
+			Source.SetDockPosition (dockPosition);
+		}
+
+		public static readonly AutomationPattern Pattern =
+			DockPatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty DockPositionProperty =
+			DockPatternIdentifiers.DockPositionProperty;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/ExpandCollapsePattern.cs b/UIAutomationClient/System.Windows.Automation/ExpandCollapsePattern.cs
new file mode 100644
index 0000000..a5a75ca
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/ExpandCollapsePattern.cs
@@ -0,0 +1,101 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using System.Windows.Automation.Provider;
+
+namespace System.Windows.Automation
+{
+	public class ExpandCollapsePattern : BasePattern
+	{
+		public struct ExpandCollapsePatternInformation
+		{
+			private bool cache;
+			private ExpandCollapsePattern pattern;
+
+			internal ExpandCollapsePatternInformation (ExpandCollapsePattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public ExpandCollapseState ExpandCollapseState {
+				get { return (ExpandCollapseState) pattern.element.GetPropertyValue (ExpandCollapseStateProperty, cache); }
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private ExpandCollapsePatternInformation currentInfo;
+		private ExpandCollapsePatternInformation cachedInfo;
+
+		internal ExpandCollapsePattern ()
+		{
+		}
+
+		internal ExpandCollapsePattern (IExpandCollapseProvider source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new ExpandCollapsePatternInformation (this, false);
+			if (cached)
+				cachedInfo = new ExpandCollapsePatternInformation (this, true);
+		}
+
+		internal IExpandCollapseProvider Source { get; private set; }
+
+		public ExpandCollapsePatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public ExpandCollapsePatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public void Expand ()
+		{
+			Source.Expand ();
+		}
+
+		public void Collapse ()
+		{
+			Source.Collapse ();
+		}
+
+		public static readonly AutomationPattern Pattern =
+			ExpandCollapsePatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty ExpandCollapseStateProperty =
+			ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/GridItemPattern.cs b/UIAutomationClient/System.Windows.Automation/GridItemPattern.cs
new file mode 100644
index 0000000..1eff09f
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/GridItemPattern.cs
@@ -0,0 +1,119 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class GridItemPattern : BasePattern
+	{
+		public struct GridItemPatternInformation
+		{
+			private bool cache;
+			private GridItemPattern pattern;
+
+			internal GridItemPatternInformation (GridItemPattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public int Row {
+				get { return (int) pattern.element.GetPropertyValue (RowProperty, cache); }
+			}
+
+			public int Column {
+				get { return (int) pattern.element.GetPropertyValue (ColumnProperty, cache); }
+			}
+
+			public int RowSpan {
+				get { return (int) pattern.element.GetPropertyValue (RowSpanProperty, cache); }
+			}
+
+			public int ColumnSpan {
+				get { return (int) pattern.element.GetPropertyValue (ColumnSpanProperty, cache); }
+			}
+
+			public AutomationElement ContainingGrid {
+				get { return (AutomationElement) pattern.element.GetPropertyValue (ContainingGridProperty, cache); }
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private GridItemPatternInformation currentInfo;
+		private GridItemPatternInformation cachedInfo;
+
+		internal GridItemPattern ()
+		{
+		}
+
+		internal GridItemPattern (IGridItemPattern source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new GridItemPatternInformation (this, false);
+			if (cached)
+				cachedInfo = new GridItemPatternInformation (this, true);
+		}
+
+		internal IGridItemPattern Source { get; private set; }
+
+		public GridItemPatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public GridItemPatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public static readonly AutomationPattern Pattern =
+			GridItemPatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty RowProperty =
+			GridItemPatternIdentifiers.RowProperty;
+
+		public static readonly AutomationProperty ColumnProperty =
+			GridItemPatternIdentifiers.ColumnProperty;
+
+		public static readonly AutomationProperty RowSpanProperty =
+			GridItemPatternIdentifiers.RowSpanProperty;
+
+		public static readonly AutomationProperty ColumnSpanProperty =
+			GridItemPatternIdentifiers.ColumnSpanProperty;
+
+		public static readonly AutomationProperty ContainingGridProperty =
+			GridItemPatternIdentifiers.ContainingGridProperty;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/GridPattern.cs b/UIAutomationClient/System.Windows.Automation/GridPattern.cs
new file mode 100644
index 0000000..f9050c9
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/GridPattern.cs
@@ -0,0 +1,101 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class GridPattern : BasePattern
+	{
+		public struct GridPatternInformation
+		{
+			private bool cache;
+			private GridPattern pattern;
+
+			internal GridPatternInformation (GridPattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+			public int RowCount {
+				get { return (int) pattern.element.GetPropertyValue (RowCountProperty, cache); }
+			}
+
+			public int ColumnCount {
+				get { return (int) pattern.element.GetPropertyValue (ColumnCountProperty, cache); }
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private GridPatternInformation currentInfo;
+		private GridPatternInformation cachedInfo;
+
+		internal GridPattern ()
+		{
+		}
+
+		internal GridPattern (IGridPattern source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new GridPatternInformation (this, false);
+			if (cached)
+				cachedInfo = new GridPatternInformation (this, true);
+		}
+
+		internal IGridPattern Source { get; private set; }
+
+		public GridPatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public GridPatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public AutomationElement GetItem (int row, int column)
+		{
+			return SourceManager.GetOrCreateAutomationElement (Source.GetItem (row, column));
+		}
+
+		public static readonly AutomationPattern Pattern =
+			GridPatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty RowCountProperty =
+			GridPatternIdentifiers.RowCountProperty;
+
+		public static readonly AutomationProperty ColumnCountProperty =
+			GridPatternIdentifiers.ColumnCountProperty;
+	}
+}
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClient/System.Windows.Automation/InvokePattern.cs
similarity index 70%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClient/System.Windows.Automation/InvokePattern.cs
index b0fc424..f225a74 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClient/System.Windows.Automation/InvokePattern.cs
@@ -20,31 +20,33 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using Mono.UIAutomation.Source;
 
 namespace System.Windows.Automation
 {
-	internal static class CaretPatternIdentifiers
+	public class InvokePattern : BasePattern
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
+		private IInvokePattern source;
+
+		internal InvokePattern (IInvokePattern source)
 		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+			this.source = source;
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
+
+		public void Invoke ()
+		{
+			source.Invoke ();
+		}
+
+		public static readonly AutomationPattern Pattern =
+			InvokePatternIdentifiers.Pattern;
+
+		public static readonly AutomationEvent InvokedEvent =
+			InvokePatternIdentifiers.InvokedEvent;
 	}
 }
diff --git a/UIAutomationClient/System.Windows.Automation/MultipleViewPattern.cs b/UIAutomationClient/System.Windows.Automation/MultipleViewPattern.cs
new file mode 100644
index 0000000..394e65f
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/MultipleViewPattern.cs
@@ -0,0 +1,109 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class MultipleViewPattern : BasePattern
+	{
+		public struct MultipleViewPatternInformation
+		{
+			private bool cache;
+			private MultipleViewPattern pattern;
+
+			internal MultipleViewPatternInformation (MultipleViewPattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public int CurrentView {
+				get { return (int) pattern.element.GetPropertyValue (CurrentViewProperty, cache); }
+			}
+
+			public int [] GetSupportedViews ()
+			{
+				return (int []) pattern.element.GetPropertyValue (SupportedViewsProperty, cache);
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private MultipleViewPatternInformation currentInfo;
+		private MultipleViewPatternInformation cachedInfo;
+
+		internal MultipleViewPattern ()
+		{
+		}
+
+		internal MultipleViewPattern (IMultipleViewPattern source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new MultipleViewPatternInformation (this, false);
+			if (cached)
+				cachedInfo = new MultipleViewPatternInformation (this, true);
+		}
+
+		internal IMultipleViewPattern Source { get; private set; }
+
+		public MultipleViewPatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public MultipleViewPatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public string GetViewName (int viewId)
+		{
+			return Source.GetViewName (viewId);
+		}
+
+		public void SetCurrentView (int viewId)
+		{
+			Source.SetCurrentView (viewId);
+		}
+
+		public static readonly AutomationPattern Pattern =
+			MultipleViewPatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty CurrentViewProperty =
+			MultipleViewPatternIdentifiers.CurrentViewProperty;
+
+		public static readonly AutomationProperty SupportedViewsProperty =
+			MultipleViewPatternIdentifiers.SupportedViewsProperty;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/NativeMethods.cs b/UIAutomationClient/System.Windows.Automation/NativeMethods.cs
new file mode 100644
index 0000000..59c7b99
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/NativeMethods.cs
@@ -0,0 +1,154 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Matt Guo <matt at mattguo.com>
+// 
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using Mono.UIAutomation.Services;
+
+namespace System.Windows.Automation
+{
+	internal class NativeMethods
+	{
+		static NativeMethods()
+		{
+			string [] args = new string [0];
+			Gdk.Global.InitCheck (ref args);
+		}
+
+		private static bool IsWindowsSys {
+			get {
+				PlatformID os = Environment.OSVersion.Platform;
+				return (os == PlatformID.Win32Windows || os == PlatformID.Win32NT ||
+					os == PlatformID.Win32S || os == PlatformID.WinCE);
+			}
+		}
+
+		private static IntPtr [] GetChildWindowHandles (IntPtr rootWin) {
+			IntPtr rootReturn;
+			IntPtr parentReturn;
+			IntPtr childrenReturn;
+			int childrenReturnCount;
+			try {
+				IntPtr dpy = gdk_x11_display_get_xdisplay (Gdk.Display.Default.Handle);
+				if (XQueryTree (dpy, rootWin, out rootReturn, out parentReturn,
+				                out childrenReturn, out childrenReturnCount) == 0)
+					return new IntPtr [0];
+				IntPtr [] children = new IntPtr [childrenReturnCount];
+				if (childrenReturnCount > 0)
+					Marshal.Copy (childrenReturn, children, 0, childrenReturnCount);
+				return children;
+			} catch (Exception ex) {
+				Log.Error ("Error, probably due to calling GDK or XQueryTree: {0}", ex.Message);
+				return new IntPtr [0];
+			}
+		}
+
+		private static IntPtr ChildWindowAtPosition (IntPtr root,
+								int px, int py, bool checkRoot)
+		{
+			if (checkRoot) {
+				var rootWin = Gdk.Window.ForeignNew ((uint) root.ToInt32());
+				if (!rootWin.IsViewable)
+					return IntPtr.Zero;
+				int x, y, w, h;
+				rootWin.GetOrigin (out x, out y);
+				rootWin.GetSize (out w, out h);
+				if (x > px || x + w < px || y > py || y + h < py)
+					return IntPtr.Zero;
+			}
+			foreach (var child in GetChildWindowHandles (root)) {
+				var ret = ChildWindowAtPosition (child, px, py, true);
+				if (ret != IntPtr.Zero)
+					return ret;
+			}
+			return root;
+		}
+
+		public static void GetScreenBound (out int width, out int height)
+		{
+			var screen = Gdk.Screen.Default;
+			width = screen.Width;
+			height = screen.Height;
+		}
+
+		public static IntPtr WindowAtPosition (int px, int py)
+		{
+			var startHandle = IntPtr.Zero;
+			var topWin = TopWindowAtPosition (px, py);
+			if (topWin != null)
+				startHandle = GetWindowHandle (topWin);
+			if (startHandle == IntPtr.Zero)
+				startHandle = RootWindowHandle;
+			return ChildWindowAtPosition (startHandle, px, py, false);
+		}
+
+		public static Gdk.Window TopWindowAtPosition (int px, int py)
+		{
+			var windowStack = Gdk.Screen.Default.WindowStack;
+			Gdk.Window ret = null;
+			foreach (Gdk.Window win in windowStack) {
+				//The latter item in "windowStack" has higher z-order
+				if (win.IsViewable && win.FrameExtents.Contains (px, py))
+					ret = win;
+			}
+			return ret;
+		}
+
+		public static IntPtr GetWindowHandle (Gdk.Window win)
+		{
+			if (win == null)
+				return IntPtr.Zero;
+			try {
+				if (IsWindowsSys)
+					return gdk_win32_drawable_get_handle (win.Handle);
+				else
+					return gdk_x11_drawable_get_xid (win.Handle);
+			} catch (Exception ex) {
+				Log.Error ("Error calling libgdk: {0}", ex.Message);
+				return IntPtr.Zero;
+			}
+		}
+
+		public static IntPtr RootWindowHandle
+		{
+			get {
+				return GetWindowHandle (Gdk.Screen.Default.RootWindow);
+			}
+		}
+
+		[DllImport ("libgdk-x11-2.0.so.0")]
+		internal static extern IntPtr gdk_x11_drawable_get_xid (IntPtr handle);
+
+		[DllImport ("libgdk-win32-2.0-0.dll")]
+		internal static extern IntPtr gdk_win32_drawable_get_handle (IntPtr handle);
+
+		[DllImport ("libgdk-x11-2.0.so.0")]
+		internal static extern IntPtr gdk_x11_display_get_xdisplay (IntPtr handle);
+
+		[DllImport("libX11.so")]
+		private static extern int XQueryTree(IntPtr display, IntPtr w, out IntPtr rootReturn, out IntPtr parentReturn, out IntPtr childrenReturn, out int childrenReturnCount);
+	}
+}
\ No newline at end of file
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClient/System.Windows.Automation/NotCondition.cs
similarity index 74%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClient/System.Windows.Automation/NotCondition.cs
index b0fc424..3eb6f3b 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClient/System.Windows.Automation/NotCondition.cs
@@ -20,31 +20,31 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
 // 
+
 using System;
 
 namespace System.Windows.Automation
 {
-	internal static class CaretPatternIdentifiers
+	public class NotCondition : Condition
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
+		private Condition condition;
+
+		public NotCondition (Condition condition)
+		{
+			this.condition = condition;
+		}
+
+		public Condition Condition {
+			get {
+				return condition;
+			}
+		}
+
+		internal override bool AppliesTo (AutomationElement element)
 		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+			return !condition.AppliesTo (element);
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
 	}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClient/System.Windows.Automation/OrCondition.cs
similarity index 72%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClient/System.Windows.Automation/OrCondition.cs
index b0fc424..fbadf12 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClient/System.Windows.Automation/OrCondition.cs
@@ -20,31 +20,33 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
 // 
+
 using System;
 
 namespace System.Windows.Automation
 {
-	internal static class CaretPatternIdentifiers
+	public class OrCondition : Condition
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
+		private Condition [] conditions;
+
+		public OrCondition (params Condition [] conditions)
+		{
+			this.conditions = conditions;
+		}
+
+		public Condition [] GetConditions ()
+		{
+			return conditions;
+		}
+
+		internal override bool AppliesTo (AutomationElement element)
 		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+			foreach (Condition cond in conditions)
+				if (cond.AppliesTo (element))
+					return true;
+			return false;
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
 	}
 }
diff --git a/UIAutomationClient/System.Windows.Automation/PropertyConditon.cs b/UIAutomationClient/System.Windows.Automation/PropertyConditon.cs
new file mode 100644
index 0000000..b4a12de
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/PropertyConditon.cs
@@ -0,0 +1,374 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+// 
+
+using System;
+using System.Globalization;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+
+namespace System.Windows.Automation
+{
+	[Flags]
+	public enum PropertyConditionFlags
+	{
+		None,
+		IgnoreCase
+	}
+
+	public class PropertyCondition : Condition
+	{
+		private AutomationProperty property;
+		private object val;
+		private PropertyConditionFlags flags;
+
+		public PropertyCondition (AutomationProperty property,
+		                          object value,
+		                          PropertyConditionFlags flags) : base ()
+		{
+			if (property == null)
+				throw new ArgumentNullException ("property");
+			this.property = property;
+
+			// NotSupported is handled the same way for all properties
+			if (value == AutomationElement.NotSupported) {
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				this.val = value;
+				this.flags = flags;
+				return;
+			}
+
+			if (property == AEIds.AcceleratorKeyProperty ||
+			    property == AEIds.AccessKeyProperty ||
+			    property == AEIds.AutomationIdProperty ||
+			    property == AEIds.ClassNameProperty ||
+			    property == AEIds.HelpTextProperty ||
+			    property == AEIds.ItemStatusProperty ||
+			    property == AEIds.ItemTypeProperty ||
+			    property == AEIds.LocalizedControlTypeProperty ||
+			    property == AEIds.NameProperty ||
+			    property == AEIds.FrameworkIdProperty ||
+			    property == ValuePatternIdentifiers.ValueProperty) {
+				if (value != null && !(value is string))
+					throw new ArgumentException ("value");
+				if (value == null && (flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = value;
+			} else if (property == AEIds.BoundingRectangleProperty) {
+				Rect? rect = null;
+				if (value == null || !(rect = value as Rect?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = new double [] {
+					rect.Value.X,
+					rect.Value.Y,
+					rect.Value.Width,
+					rect.Value.Height };
+			} else if (property == AEIds.ClickablePointProperty) {
+				Point? point = null;
+				if (value == null || !(point = value as Point?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = new double [] {
+					point.Value.X,
+					point.Value.Y };
+			} else if (property == AEIds.ControlTypeProperty) {
+				ControlType controlType = null;
+				if (value != null && (controlType = value as ControlType) == null)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				if (controlType != null)
+					val = controlType.Id;
+			} else if (property == AEIds.CultureProperty) {
+				CultureInfo culture = null;
+				if (value != null && (culture = value as CultureInfo) == null)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				if (culture != null)
+					val = culture.LCID;
+			} else if (property == AEIds.HasKeyboardFocusProperty ||
+			           property == AEIds.IsContentElementProperty ||
+			           property == AEIds.IsControlElementProperty ||
+			           property == AEIds.IsDockPatternAvailableProperty ||
+			           property == AEIds.IsEnabledProperty ||
+			           property == AEIds.IsExpandCollapsePatternAvailableProperty ||
+			           property == AEIds.IsGridItemPatternAvailableProperty ||
+			           property == AEIds.IsGridPatternAvailableProperty ||
+			           property == AEIds.IsInvokePatternAvailableProperty ||
+			           property == AEIds.IsKeyboardFocusableProperty ||
+			           property == AEIds.IsMultipleViewPatternAvailableProperty ||
+			           property == AEIds.IsOffscreenProperty ||
+			           property == AEIds.IsPasswordProperty ||
+			           property == AEIds.IsRangeValuePatternAvailableProperty ||
+			           property == AEIds.IsRequiredForFormProperty ||
+			           property == AEIds.IsScrollItemPatternAvailableProperty ||
+			           property == AEIds.IsScrollPatternAvailableProperty ||
+			           property == AEIds.IsSelectionItemPatternAvailableProperty ||
+			           property == AEIds.IsSelectionPatternAvailableProperty ||
+			           property == AEIds.IsTableItemPatternAvailableProperty ||
+			           property == AEIds.IsTablePatternAvailableProperty ||
+			           property == AEIds.IsTextPatternAvailableProperty ||
+			           property == AEIds.IsTogglePatternAvailableProperty ||
+			           property == AEIds.IsTransformPatternAvailableProperty ||
+			           property == AEIds.IsValuePatternAvailableProperty ||
+			           property == AEIds.IsWindowPatternAvailableProperty ||
+			           property == RangeValuePatternIdentifiers.IsReadOnlyProperty ||
+			           property == ScrollPatternIdentifiers.HorizontallyScrollableProperty ||
+			           property == ScrollPatternIdentifiers.VerticallyScrollableProperty ||
+			           property == SelectionItemPatternIdentifiers.IsSelectedProperty ||
+			           property == SelectionPatternIdentifiers.CanSelectMultipleProperty ||
+			           property == SelectionPatternIdentifiers.IsSelectionRequiredProperty ||
+			           property == TransformPatternIdentifiers.CanMoveProperty ||
+			           property == TransformPatternIdentifiers.CanResizeProperty ||
+			           property == TransformPatternIdentifiers.CanRotateProperty ||
+			           property == ValuePatternIdentifiers.IsReadOnlyProperty ||
+			           property == WindowPatternIdentifiers.CanMaximizeProperty ||
+			           property == WindowPatternIdentifiers.CanMinimizeProperty ||
+			           property == WindowPatternIdentifiers.IsModalProperty ||
+			           property == WindowPatternIdentifiers.IsTopmostProperty) {
+				bool? boolVal = null;
+				if (value == null || !(boolVal = value as bool?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = boolVal.Value;
+			} else if (property == AEIds.LabeledByProperty ||
+			           property == GridItemPatternIdentifiers.ContainingGridProperty ||
+			           property == SelectionItemPatternIdentifiers.SelectionContainerProperty) {
+				AutomationElement element = null;
+				if (value != null && (element = value as AutomationElement) == null)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				if (element != null)
+					val = element.GetRuntimeId ();
+			} else if (property == AEIds.NativeWindowHandleProperty ||
+			           property == AEIds.ProcessIdProperty ||
+			           property == GridItemPatternIdentifiers.ColumnProperty ||
+			           property == GridItemPatternIdentifiers.ColumnSpanProperty ||
+			           property == GridItemPatternIdentifiers.RowProperty ||
+			           property == GridItemPatternIdentifiers.RowSpanProperty ||
+			           property == GridPatternIdentifiers.ColumnCountProperty ||
+			           property == GridPatternIdentifiers.RowCountProperty ||
+			           property == MultipleViewPatternIdentifiers.CurrentViewProperty) {
+				int? intVal = null;
+				if (value == null || !(intVal = value as int?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = intVal.Value;
+			} else if (property == AEIds.OrientationProperty) {
+				OrientationType? orientation = null;
+				if (value == null || !(orientation = value as OrientationType?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = orientation.Value;
+			} else if (property == AEIds.RuntimeIdProperty ||
+			           property == MultipleViewPatternIdentifiers.SupportedViewsProperty) {
+				int [] runtimeId = null;
+				if (value != null && (runtimeId = value as int []) == null)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				if (runtimeId != null)
+					val = runtimeId;
+			} else if (property == DockPatternIdentifiers.DockPositionProperty) {
+				DockPosition? position = null;
+				if (value == null || !(position = value as DockPosition?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = position.Value;
+			} else if (property == ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty) {
+				ExpandCollapseState? state = null;
+				if (value == null || !(state = value as ExpandCollapseState?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = state.Value;
+			} else if (property == RangeValuePatternIdentifiers.LargeChangeProperty ||
+			           property == RangeValuePatternIdentifiers.SmallChangeProperty ||
+			           property == RangeValuePatternIdentifiers.ValueProperty ||
+			           property == ScrollPatternIdentifiers.HorizontalScrollPercentProperty ||
+			           property == ScrollPatternIdentifiers.HorizontalViewSizeProperty ||
+			           property == ScrollPatternIdentifiers.VerticalScrollPercentProperty ||
+			           property == ScrollPatternIdentifiers.VerticalViewSizeProperty) {
+				double? doubleVal = null;
+				if (value == null || !(doubleVal = value as double?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = doubleVal.Value;
+			} else if (property == RangeValuePatternIdentifiers.MaximumProperty ||
+			           property == RangeValuePatternIdentifiers.MinimumProperty) {
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase &&
+				    !(value is string))
+					throw new ArgumentException ("flags");
+				val = value;
+			} else if (property == SelectionPatternIdentifiers.SelectionProperty ||
+			           property == TableItemPatternIdentifiers.ColumnHeaderItemsProperty ||
+			           property == TableItemPatternIdentifiers.RowHeaderItemsProperty ||
+			           property == TablePatternIdentifiers.ColumnHeadersProperty ||
+			           property == TablePatternIdentifiers.RowHeadersProperty) {
+				AutomationElement [] elements = null;
+				if (value != null && (elements = value as AutomationElement []) == null)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				if (elements != null)
+					val = elements;
+			} else if (property == TablePatternIdentifiers.RowOrColumnMajorProperty) {
+				RowOrColumnMajor? state = null;
+				if (value == null || !(state = value as RowOrColumnMajor?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = state.Value;
+			} else if (property == TogglePatternIdentifiers.ToggleStateProperty) {
+				ToggleState? state = null;
+				if (value == null || !(state = value as ToggleState?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = state.Value;
+			} else if (property == WindowPatternIdentifiers.WindowInteractionStateProperty) {
+				WindowInteractionState? state = null;
+				if (value == null || !(state = value as WindowInteractionState?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = state.Value;
+			} else if (property == WindowPatternIdentifiers.WindowVisualStateProperty) {
+				WindowVisualState? state = null;
+				if (value == null || !(state = value as WindowVisualState?).HasValue)
+					throw new ArgumentException ("value");
+				if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase)
+					throw new ArgumentException ("flags");
+				val = state.Value;
+			}
+
+			this.flags = flags;
+		}
+
+		public PropertyCondition (AutomationProperty property, object value) :
+			this (property, value, PropertyConditionFlags.None)
+		{
+		}
+
+		public AutomationProperty Property {
+			get {
+				return property;
+			}
+		}
+
+		public object Value {
+			get {
+				return val;
+			}
+		}
+
+		public PropertyConditionFlags Flags {
+			get {
+				return flags;
+			}
+		}
+
+		internal override bool AppliesTo (AutomationElement element)
+		{
+			// TODO: Test caching behavior
+			object currentVal = element.GetCurrentPropertyValue (property);
+			object conditionVal = val;
+
+			if (currentVal == null || conditionVal == null)
+				return currentVal == conditionVal;
+
+			// Compare AutomationElements against Condition's
+			// stored runtime ID array
+			if (property == AEIds.LabeledByProperty ||
+			    property == GridItemPatternIdentifiers.ContainingGridProperty ||
+			    property == SelectionItemPatternIdentifiers.SelectionContainerProperty) {
+				AutomationElement elementVal =
+					currentVal as AutomationElement;
+				int [] conditionId = conditionVal as int [];
+				return currentVal != null &&
+					conditionId != null &&
+					Automation.Compare (conditionId,
+					                    elementVal.GetRuntimeId ());
+			}
+
+			// For some other properties, need to reconstruct proper
+			// object for comparison
+			if (property == AEIds.BoundingRectangleProperty) {
+				double [] rectArray = (double []) val;
+				conditionVal = new Rect (rectArray [0],
+				                         rectArray [1],
+				                         rectArray [2],
+				                         rectArray [3]);
+			} else if (property == AEIds.ClickablePointProperty) {
+				double [] pointArray = (double []) val;
+				conditionVal = new Point (pointArray [0],
+				                          pointArray [1]);
+			} else if (property == AEIds.ControlTypeProperty)
+				conditionVal = ControlType.LookupById ((int) val);
+			else if (property == AEIds.CultureProperty)
+				conditionVal = new CultureInfo ((int) val);
+
+			return ArePropertyValuesEqual (conditionVal, currentVal);
+		}
+
+		private bool ArePropertyValuesEqual (object val1, object val2)
+		{
+			if (val1 == null || val2 == null)
+				return val1 == val2;
+
+			if ((flags & PropertyConditionFlags.IgnoreCase) == PropertyConditionFlags.IgnoreCase) {
+				string string1 = val1 as string;
+				string string2 = val2 as string;
+				if (string1 != null && string2 != null)
+					return string1.Equals (string2, StringComparison.OrdinalIgnoreCase);
+			}
+
+			// Custom equality checking for certain types
+			Array array1 = val1 as Array;
+			Array array2 = val2 as Array;
+			if (array1 != null && array2 != null) {
+				if (array1.Length != array2.Length)
+					return false;
+				// NOTE: Assuming ordering requirement
+				for (int i = 0; i < array1.Length; i++)
+					if (!ArePropertyValuesEqual (array1.GetValue (i), array2.GetValue (i)))
+						return false;
+				return true;
+			}
+
+			return val1.Equals (val2);
+		}
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/RangeValuePattern.cs b/UIAutomationClient/System.Windows.Automation/RangeValuePattern.cs
new file mode 100644
index 0000000..650c850
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/RangeValuePattern.cs
@@ -0,0 +1,131 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class RangeValuePattern : BasePattern
+	{
+		public struct RangeValuePatternInformation
+		{
+			private bool cache;
+			private RangeValuePattern pattern;
+
+			internal RangeValuePatternInformation (RangeValuePattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public double Value {
+				get { return (double) pattern.element.GetPropertyValue (ValueProperty, cache); }
+			}
+
+			public bool IsReadOnly {
+				get { return (bool) pattern.element.GetPropertyValue (IsReadOnlyProperty, cache); }
+			}
+
+			public double Maximum {
+				get { return (double) pattern.element.GetPropertyValue (MaximumProperty, cache); }
+			}
+
+			public double Minimum {
+				get { return (double) pattern.element.GetPropertyValue (MinimumProperty, cache); }
+			}
+
+			public double LargeChange {
+				get { return (double) pattern.element.GetPropertyValue (LargeChangeProperty, cache); }
+			}
+
+			public double SmallChange {
+				get { return (double) pattern.element.GetPropertyValue (SmallChangeProperty, cache); }
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private RangeValuePatternInformation currentInfo;
+		private RangeValuePatternInformation cachedInfo;
+
+		internal RangeValuePattern ()
+		{
+		}
+
+		internal RangeValuePattern (IRangeValuePattern source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new RangeValuePatternInformation (this, false);
+			if (cached)
+				cachedInfo = new RangeValuePatternInformation (this, true);
+		}
+
+		internal IRangeValuePattern Source { get; private set; }
+
+		public RangeValuePatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public RangeValuePatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public void SetValue (double value)
+		{
+			Source.SetValue (value);
+		}
+
+		public static readonly AutomationPattern Pattern =
+			RangeValuePatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty ValueProperty =
+			RangeValuePatternIdentifiers.ValueProperty;
+
+		public static readonly AutomationProperty IsReadOnlyProperty =
+			RangeValuePatternIdentifiers.IsReadOnlyProperty;
+
+		public static readonly AutomationProperty MinimumProperty =
+			RangeValuePatternIdentifiers.MinimumProperty;
+
+		public static readonly AutomationProperty MaximumProperty =
+			RangeValuePatternIdentifiers.MaximumProperty;
+
+		public static readonly AutomationProperty LargeChangeProperty =
+			RangeValuePatternIdentifiers.LargeChangeProperty;
+
+		public static readonly AutomationProperty SmallChangeProperty =
+			RangeValuePatternIdentifiers.SmallChangeProperty;
+	}
+}
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClient/System.Windows.Automation/ScrollItemPattern.cs
similarity index 73%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClient/System.Windows.Automation/ScrollItemPattern.cs
index b0fc424..22bc816 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClient/System.Windows.Automation/ScrollItemPattern.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Windows.Automation.Provider;
 
 namespace System.Windows.Automation
 {
-	internal static class CaretPatternIdentifiers
+	public class ScrollItemPattern : BasePattern
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
+		private IScrollItemProvider source;
+
+		internal ScrollItemPattern (IScrollItemProvider source)
+		{
+			this.source = source;
+		}
+
+		public void ScrollIntoView ()
 		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+			source.ScrollIntoView ();
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
+
+		public static readonly AutomationPattern Pattern =
+			ScrollItemPatternIdentifiers.Pattern;
 	}
 }
diff --git a/UIAutomationClient/System.Windows.Automation/ScrollPattern.cs b/UIAutomationClient/System.Windows.Automation/ScrollPattern.cs
new file mode 100644
index 0000000..8f9633b
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/ScrollPattern.cs
@@ -0,0 +1,148 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class ScrollPattern : BasePattern
+	{
+		public struct ScrollPatternInformation
+		{
+			private bool cache;
+			private ScrollPattern pattern;
+
+			internal ScrollPatternInformation (ScrollPattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public double HorizontalScrollPercent {
+				get { return (double) pattern.element.GetPropertyValue (HorizontalScrollPercentProperty, cache); }
+			}
+
+			public double VerticalScrollPercent {
+				get { return (double) pattern.element.GetPropertyValue (VerticalScrollPercentProperty, cache); }
+			}
+
+			public double HorizontalViewSize {
+				get { return (double) pattern.element.GetPropertyValue (HorizontalViewSizeProperty, cache); }
+			}
+
+			public double VerticalViewSize {
+				get { return (double) pattern.element.GetPropertyValue (VerticalViewSizeProperty, cache); }
+			}
+
+			public bool HorizontallyScrollable {
+				get { return (bool) pattern.element.GetPropertyValue (HorizontallyScrollableProperty, cache); }
+			}
+
+			public bool VerticallyScrollable {
+				get { return (bool) pattern.element.GetPropertyValue (VerticallyScrollableProperty, cache); }
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private ScrollPatternInformation currentInfo;
+		private ScrollPatternInformation cachedInfo;
+
+		internal ScrollPattern ()
+		{
+		}
+
+		internal ScrollPattern (IScrollPattern source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new ScrollPatternInformation (this, false);
+			if (cached)
+				cachedInfo = new ScrollPatternInformation (this, true);
+		}
+
+		internal IScrollPattern Source { get; private set; }
+
+		public ScrollPatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public ScrollPatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public void SetScrollPercent (double horizontalPercent, double verticalPercent)
+		{
+			Source.SetScrollPercent (horizontalPercent, verticalPercent);
+		}
+
+		public void Scroll (ScrollAmount horizontalAmount, ScrollAmount verticalAmount)
+		{
+			Source.Scroll (horizontalAmount, verticalAmount);
+		}
+
+		public void ScrollHorizontal (ScrollAmount amount)
+		{
+			Source.Scroll (amount, ScrollAmount.NoAmount);
+		}
+
+		public void ScrollVertical (ScrollAmount amount)
+		{
+			Source.Scroll (ScrollAmount.NoAmount, amount);
+		}
+
+		public static readonly AutomationPattern Pattern =
+			ScrollPatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty HorizontalScrollPercentProperty =
+			ScrollPatternIdentifiers.HorizontalScrollPercentProperty;
+
+		public static readonly AutomationProperty VerticalScrollPercentProperty =
+			ScrollPatternIdentifiers.VerticalScrollPercentProperty;
+
+		public static readonly AutomationProperty HorizontalViewSizeProperty =
+			ScrollPatternIdentifiers.HorizontalViewSizeProperty;
+
+		public static readonly AutomationProperty VerticalViewSizeProperty =
+			ScrollPatternIdentifiers.VerticalViewSizeProperty;
+
+		public static readonly AutomationProperty HorizontallyScrollableProperty =
+			ScrollPatternIdentifiers.HorizontallyScrollableProperty;
+
+		public static readonly AutomationProperty VerticallyScrollableProperty =
+			ScrollPatternIdentifiers.VerticallyScrollableProperty;
+
+		public const double NoScroll = -1;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/SelectionItemPattern.cs b/UIAutomationClient/System.Windows.Automation/SelectionItemPattern.cs
new file mode 100644
index 0000000..9eb4035
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/SelectionItemPattern.cs
@@ -0,0 +1,122 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class SelectionItemPattern : BasePattern
+	{
+		public struct SelectionItemPatternInformation
+		{
+			private bool cache;
+			private SelectionItemPattern pattern;
+
+			internal SelectionItemPatternInformation (SelectionItemPattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public bool IsSelected {
+				get { return (bool) pattern.element.GetPropertyValue (IsSelectedProperty, cache); }
+			}
+
+			public AutomationElement SelectionContainer {
+				get { return (AutomationElement) pattern.element.GetPropertyValue (SelectionContainerProperty, cache); }
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private SelectionItemPatternInformation currentInfo;
+		private SelectionItemPatternInformation cachedInfo;
+
+		internal SelectionItemPattern ()
+		{
+		}
+
+		internal SelectionItemPattern (ISelectionItemPattern source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new SelectionItemPatternInformation (this, false);
+			if (cached)
+				cachedInfo = new SelectionItemPatternInformation (this, true);
+		}
+
+		internal ISelectionItemPattern Source { get; private set; }
+
+		public SelectionItemPatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public SelectionItemPatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public void Select ()
+		{
+			Source.Select ();
+		}
+
+		public void AddToSelection ()
+		{
+			Source.AddToSelection ();
+		}
+
+		public void RemoveFromSelection ()
+		{
+			Source.RemoveFromSelection ();
+		}
+
+		public static readonly AutomationPattern Pattern =
+			SelectionItemPatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty IsSelectedProperty =
+			SelectionItemPatternIdentifiers.IsSelectedProperty;
+
+		public static readonly AutomationProperty SelectionContainerProperty =
+			SelectionItemPatternIdentifiers.SelectionContainerProperty;
+
+		public static readonly AutomationEvent ElementAddedToSelectionEvent =
+			SelectionItemPatternIdentifiers.ElementAddedToSelectionEvent;
+
+		public static readonly AutomationEvent ElementRemovedFromSelectionEvent =
+			SelectionItemPatternIdentifiers.ElementRemovedFromSelectionEvent;
+
+		public static readonly AutomationEvent ElementSelectedEvent =
+			SelectionItemPatternIdentifiers.ElementSelectedEvent;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/SelectionPattern.cs b/UIAutomationClient/System.Windows.Automation/SelectionPattern.cs
new file mode 100644
index 0000000..ae3f4f7
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/SelectionPattern.cs
@@ -0,0 +1,109 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class SelectionPattern : BasePattern
+	{
+		public struct SelectionPatternInformation
+		{
+			private bool cache;
+			private SelectionPattern pattern;
+
+			internal SelectionPatternInformation (SelectionPattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public bool CanSelectMultiple {
+				get { return (bool) pattern.element.GetPropertyValue (CanSelectMultipleProperty, cache); }
+			}
+
+			public bool IsSelectionRequired {
+				get { return (bool) pattern.element.GetPropertyValue (IsSelectionRequiredProperty, cache); }
+			}
+
+			public AutomationElement [] GetSelection ()
+			{
+				return (AutomationElement []) pattern.element.GetPropertyValue (SelectionProperty, cache);
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private SelectionPatternInformation currentInfo;
+		private SelectionPatternInformation cachedInfo;
+
+		internal SelectionPattern ()
+		{
+		}
+
+		internal SelectionPattern (ISelectionPattern source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new SelectionPatternInformation (this, false);
+			if (cached)
+				cachedInfo = new SelectionPatternInformation (this, true);
+		}
+
+		internal ISelectionPattern Source { get; private set; }
+
+		public SelectionPatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public SelectionPatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public static readonly AutomationPattern Pattern =
+			SelectionPatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty SelectionProperty =
+			SelectionPatternIdentifiers.SelectionProperty;
+
+		public static readonly AutomationProperty CanSelectMultipleProperty =
+			SelectionPatternIdentifiers.CanSelectMultipleProperty;
+
+		public static readonly AutomationProperty IsSelectionRequiredProperty =
+			SelectionPatternIdentifiers.IsSelectionRequiredProperty;
+
+		public static readonly AutomationEvent InvalidatedEvent =
+			SelectionPatternIdentifiers.InvalidatedEvent;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/SourceManager.cs b/UIAutomationClient/System.Windows.Automation/SourceManager.cs
new file mode 100644
index 0000000..60c72dd
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/SourceManager.cs
@@ -0,0 +1,133 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//      Sandy Armstrong <sanfordarmstrong at gmail.com>
+// 
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+
+using Mono.UIAutomation.Source;
+using Mono.UIAutomation.Services;
+
+namespace System.Windows.Automation
+{
+	internal static class SourceManager
+	{
+		private const string AtspiUiaSourceAssembly =
+			"AtspiUiaSource, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f4ceacb585d99812";
+		private const string UiaDbusSourceAssembly =
+			"UiaDbusSource, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f4ceacb585d99812";
+		private static IAutomationSource [] sources = null;
+		private static object sourcesLock = new object ();
+
+		internal static IAutomationSource [] GetAutomationSources ()
+		{
+			if (sources == null) {
+				lock (sourcesLock) {
+					if (sources == null) {
+						var sourcesList = new List<IAutomationSource> ();
+
+						// Let MONO_UIA_SOURCE env var override default source
+						string sourceAssemblyNames =
+							Environment.GetEnvironmentVariable ("MONO_UIA_SOURCE");
+
+						if (string.IsNullOrEmpty (sourceAssemblyNames))
+							sourceAssemblyNames =
+								UiaDbusSourceAssembly + ";" + AtspiUiaSourceAssembly;
+
+						foreach (string sourceAssembly in sourceAssemblyNames.Split (';')) {
+							if (string.IsNullOrEmpty (sourceAssembly))
+								continue;
+							IAutomationSource source = GetAutomationSource (sourceAssembly);
+							if (source != null)
+								sourcesList.Add (source);
+						}
+						sources = sourcesList.ToArray ();
+					}
+				}
+			}
+			return sources;
+		}
+
+		// TODO: Rename to GetAutomationElement
+		// Note: this method could be invoked by multiple threads simultaneously
+		internal static AutomationElement GetOrCreateAutomationElement (IElement sourceElement)
+		{
+			if (sourceElement == null)
+				return null;
+			return new AutomationElement (sourceElement);
+		}
+
+		// TODO: Rename to GetAutomationElements
+		internal static AutomationElement [] GetOrCreateAutomationElements (IElement [] sourceElements)
+		{
+			AutomationElement [] ret = new AutomationElement [sourceElements.Length];
+			for (int i = 0; i < sourceElements.Length; i++)
+				ret [i] = GetOrCreateAutomationElement (sourceElements [i]);
+			return ret;
+		}
+
+		private static IAutomationSource GetAutomationSource (string sourceAssemblyName)
+		{
+			Assembly sourceAssembly = null;
+			try {
+				sourceAssembly = Assembly.Load (sourceAssemblyName);
+			} catch (Exception e){
+				Log.Warn (string.Format ("Error loading UIA source ({0}): {1}",
+				                                  sourceAssemblyName,
+				                                  e));
+				return null;
+			}
+
+			Type sourceType = null;
+
+			// Quickie inefficent implementation
+			Type sourceInterfaceType = typeof (IAutomationSource);
+			foreach (Type type in sourceAssembly.GetTypes ()) {
+				if (sourceInterfaceType.IsAssignableFrom (type)) {
+					sourceType = type;
+					break;
+				}
+			}
+			if (sourceType == null) {
+				Log.Error ("No UIA source found in assembly: " +
+				                   sourceAssemblyName);
+				return null;
+			}
+
+			try {
+				IAutomationSource source
+					= (IAutomationSource) Activator.CreateInstance (sourceType);
+				if (!source.IsAccessibilityEnabled)
+					return null;
+
+				source.Initialize ();
+				return source;
+			} catch (Exception e) {
+				Log.Error ("Failed to load UIA source: " + e);
+				return null;
+			}
+		}
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/TableItemPattern.cs b/UIAutomationClient/System.Windows.Automation/TableItemPattern.cs
new file mode 100644
index 0000000..96c8e93
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/TableItemPattern.cs
@@ -0,0 +1,120 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class TableItemPattern : GridItemPattern
+	{
+		public struct TableItemPatternInformation
+		{
+			private bool cache;
+			private TableItemPattern pattern;
+
+			internal TableItemPatternInformation (TableItemPattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public int Row {
+				get { return (int) pattern.element.GetPropertyValue (RowProperty, cache); }
+			}
+
+			public int Column {
+				get { return (int) pattern.element.GetPropertyValue (ColumnProperty, cache); }
+			}
+
+			public int RowSpan {
+				get { return (int) pattern.element.GetPropertyValue (RowSpanProperty, cache); }
+			}
+
+			public int ColumnSpan {
+				get { return (int) pattern.element.GetPropertyValue (ColumnSpanProperty, cache); }
+			}
+
+			public AutomationElement ContainingGrid {
+				get { return (AutomationElement) pattern.element.GetPropertyValue (ContainingGridProperty, cache); }
+			}
+
+			public AutomationElement [] GetRowHeaderItems ()
+			{
+				return (AutomationElement []) pattern.element.GetPropertyValue (RowHeaderItemsProperty, cache);
+			}
+
+			public AutomationElement [] GetColumnHeaderItems ()
+			{
+				return (AutomationElement []) pattern.element.GetPropertyValue (ColumnHeaderItemsProperty, cache);
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private TableItemPatternInformation currentInfo;
+		private TableItemPatternInformation cachedInfo;
+
+		internal TableItemPattern ()
+		{
+		}
+
+		internal TableItemPattern (ITableItemPattern source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new TableItemPatternInformation (this, false);
+			if (cached)
+				cachedInfo = new TableItemPatternInformation (this, true);
+		}
+
+		internal new ITableItemPattern Source { get; private set; }
+
+		public new TableItemPatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public new TableItemPatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public new static readonly AutomationPattern Pattern =
+			TableItemPatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty RowHeaderItemsProperty =
+			TableItemPatternIdentifiers.RowHeaderItemsProperty;
+
+		public static readonly AutomationProperty ColumnHeaderItemsProperty =
+			TableItemPatternIdentifiers.ColumnHeaderItemsProperty;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/TablePattern.cs b/UIAutomationClient/System.Windows.Automation/TablePattern.cs
new file mode 100644
index 0000000..94087c0
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/TablePattern.cs
@@ -0,0 +1,116 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class TablePattern : GridPattern
+	{
+		public struct TablePatternInformation
+		{
+			private bool cache;
+			private TablePattern pattern;
+
+			internal TablePatternInformation (TablePattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public int RowCount {
+				get { return (int) pattern.element.GetPropertyValue (RowCountProperty, cache); }
+			}
+
+			public int ColumnCount {
+				get { return (int) pattern.element.GetPropertyValue (ColumnCountProperty, cache); }
+			}
+
+			public RowOrColumnMajor RowOrColumnMajor {
+				get { return (RowOrColumnMajor) pattern.element.GetPropertyValue (RowOrColumnMajorProperty, cache); }
+			}
+
+			public AutomationElement [] GetRowHeaders ()
+			{
+				return (AutomationElement []) pattern.element.GetPropertyValue (RowHeadersProperty, cache);
+			}
+
+			public AutomationElement [] GetColumnHeaders ()
+			{
+				return (AutomationElement []) pattern.element.GetPropertyValue (ColumnHeadersProperty, cache);
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private TablePatternInformation currentInfo;
+		private TablePatternInformation cachedInfo;
+
+		internal TablePattern ()
+		{
+		}
+
+		internal TablePattern (ITablePattern source, AutomationElement element, bool cached) :
+			base (source, element, cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new TablePatternInformation (this, false);
+			if (cached)
+				cachedInfo = new TablePatternInformation (this, true);
+		}
+
+		internal new ITablePattern Source { get; private set; }
+
+		public new TablePatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public new TablePatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public new static readonly AutomationPattern Pattern =
+			TablePatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty RowHeadersProperty =
+			TablePatternIdentifiers.RowHeadersProperty;
+
+		public static readonly AutomationProperty ColumnHeadersProperty =
+			TablePatternIdentifiers.ColumnHeadersProperty;
+
+		public static readonly AutomationProperty RowOrColumnMajorProperty =
+			TablePatternIdentifiers.RowOrColumnMajorProperty;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/TextPattern.cs b/UIAutomationClient/System.Windows.Automation/TextPattern.cs
index e85572b..d0e93f1 100644
--- a/UIAutomationClient/System.Windows.Automation/TextPattern.cs
+++ b/UIAutomationClient/System.Windows.Automation/TextPattern.cs
@@ -21,43 +21,81 @@
 // 
 // Authors: 
 //      Brad Taylor <brad at getcoded.net>
+//  Mike Gorse <mgorse at novell.com>
 // 
 
 using System;
 using System.Windows.Automation.Text;
+using Mono.UIAutomation.Source;
 
 namespace System.Windows.Automation
 {
 	public class TextPattern : BasePattern
 	{
+		#region Private Fields
+		private ITextPattern source;
+#endregion
+
 #region Constructor
 		private TextPattern ()
 		{
 		}
+
+		internal TextPattern (ITextPattern source)
+		{
+			this.source = source;
+		}
+#endregion
+
+#region Public Properties
+
+		public SupportedTextSelection SupportedTextSelection {
+			get {
+				return source.SupportedTextSelection;
+			}
+		}
+
+		public TextPatternRange DocumentRange {
+			get {
+				return new TextPatternRange (this, source.DocumentRange);
+			}
+		}
+
 #endregion
 
 #region Public Methods
 		public TextPatternRange[] GetSelection ()
 		{
-			throw new NotImplementedException ();
+			return RangeArray (source.GetSelection ());
 		}
 
 		public TextPatternRange[] GetVisibleRanges ()
 		{
-			throw new NotImplementedException ();
+			return RangeArray (source.GetVisibleRanges ());
 		}
 
 		public TextPatternRange RangeFromChild (AutomationElement childElement)
 		{
-			throw new NotImplementedException ();
+			return new TextPatternRange (this, source.RangeFromChild (childElement.SourceElement));
 		}
 
 		public TextPatternRange RangeFromPoint (Point screenLocation)
 		{
-			throw new NotImplementedException ();
+			return new TextPatternRange (this, source.RangeFromPoint (screenLocation));
 		}
 #endregion
 		
+#region Private Methods
+
+		TextPatternRange [] RangeArray (ITextPatternRange [] source)
+		{
+			TextPatternRange [] ret = new TextPatternRange [source.Length];
+			for (int i = 0; i < source.Length; i++)
+				ret [i] = new TextPatternRange (this, source [i]);
+			return ret;
+		}
+#endregion
+
 #region Public Fields
 		public static readonly AutomationTextAttribute AnimationStyleAttribute = TextPatternIdentifiers.AnimationStyleAttribute;
 
@@ -124,6 +162,12 @@ namespace System.Windows.Automation
 		public static readonly AutomationTextAttribute UnderlineColorAttribute = TextPatternIdentifiers.UnderlineColorAttribute;
 
 		public static readonly AutomationTextAttribute UnderlineStyleAttribute = TextPatternIdentifiers.UnderlineStyleAttribute;
+
+		public static readonly AutomationEvent TextChangedEvent =
+			TextPatternIdentifiers.TextChangedEvent;
+
+		public static readonly AutomationEvent TextSelectionChangedEvent =
+			TextPatternIdentifiers.TextSelectionChangedEvent;
 #endregion
 	}
 }
diff --git a/UIAutomationClient/System.Windows.Automation/TogglePattern.cs b/UIAutomationClient/System.Windows.Automation/TogglePattern.cs
new file mode 100644
index 0000000..83014f4
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/TogglePattern.cs
@@ -0,0 +1,96 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using System.Windows.Automation.Provider;
+
+namespace System.Windows.Automation
+{
+	public class TogglePattern : BasePattern
+	{
+		public struct TogglePatternInformation
+		{
+			private bool cache;
+			private TogglePattern pattern;
+
+			internal TogglePatternInformation (TogglePattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public ToggleState ToggleState {
+				get { return (ToggleState) pattern.element.GetPropertyValue (ToggleStateProperty, cache); }
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private TogglePatternInformation currentInfo;
+		private TogglePatternInformation cachedInfo;
+
+		internal TogglePattern ()
+		{
+		}
+
+		internal TogglePattern (IToggleProvider source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new TogglePatternInformation (this, false);
+			if (cached)
+				cachedInfo = new TogglePatternInformation (this, true);
+		}
+
+		internal IToggleProvider Source { get; private set; }
+
+		public TogglePatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public TogglePatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public void Toggle ()
+		{
+			Source.Toggle ();
+		}
+
+		public static readonly AutomationPattern Pattern =
+			TogglePatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty ToggleStateProperty =
+			TogglePatternIdentifiers.ToggleStateProperty;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/TransformPattern.cs b/UIAutomationClient/System.Windows.Automation/TransformPattern.cs
new file mode 100644
index 0000000..125b37a
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/TransformPattern.cs
@@ -0,0 +1,120 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class TransformPattern : BasePattern
+	{
+		public struct TransformPatternInformation
+		{
+			private bool cache;
+			private TransformPattern pattern;
+
+			internal TransformPatternInformation (TransformPattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public bool CanMove {
+				get { return (bool) pattern.element.GetPropertyValue (CanMoveProperty, cache); }
+			}
+
+			public bool CanResize {
+				get { return (bool) pattern.element.GetPropertyValue (CanResizeProperty, cache); }
+			}
+
+			public bool CanRotate {
+				get { return (bool) pattern.element.GetPropertyValue (CanRotateProperty, cache); }
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private TransformPatternInformation currentInfo;
+		private TransformPatternInformation cachedInfo;
+
+		internal TransformPattern ()
+		{
+		}
+
+		internal TransformPattern (ITransformPattern source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new TransformPatternInformation (this, false);
+			if (cached)
+				cachedInfo = new TransformPatternInformation (this, true);
+		}
+
+		internal ITransformPattern Source { get; private set; }
+
+		public TransformPatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public TransformPatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public void Move (double x, double y)
+		{
+			Source.Move (x, y);
+		}
+
+		public void Resize (double width, double height)
+		{
+			Source.Resize (width, height);
+		}
+
+		public void Rotate (double degrees)
+		{
+			Source.Rotate (degrees);
+		}
+
+		public static readonly AutomationPattern Pattern =
+			TransformPatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty CanMoveProperty =
+			TransformPatternIdentifiers.CanMoveProperty;
+
+		public static readonly AutomationProperty CanResizeProperty =
+			TransformPatternIdentifiers.CanResizeProperty;
+
+		public static readonly AutomationProperty CanRotateProperty =
+			TransformPatternIdentifiers.CanRotateProperty;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/TreeWalker.TreeIterator.cs b/UIAutomationClient/System.Windows.Automation/TreeWalker.TreeIterator.cs
new file mode 100644
index 0000000..8f5a55c
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/TreeWalker.TreeIterator.cs
@@ -0,0 +1,325 @@
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//  
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
+// 
+// Authors:
+//      Sandy Armstrong <sanfordarmstrong at gmail.com>
+//
+
+using System;
+using System.Collections.Generic;
+
+using Mono.UIAutomation.Source;
+using Mono.UIAutomation.Services;
+
+namespace System.Windows.Automation
+{
+	public sealed partial class TreeWalker
+	{
+		private class TreeIterator
+		{
+			#region Private Fields
+			private List<AutomationElement> markedElements;
+			private Condition condition;
+			#endregion
+
+			#region Constructor
+			public TreeIterator (Condition condition)
+			{
+				this.condition = condition;
+				markedElements = new List<AutomationElement> ();
+			}
+			#endregion
+
+			#region Private Direct Navigation Methods
+			private AutomationElement GetFirstDirectChild (AutomationElement element)
+			{
+				AutomationElement firstChild = null;
+
+				if (element == AutomationElement.RootElement)
+					lock (TreeWalker.RawViewWalker.directChildrenLock) {
+						firstChild = TreeWalker.RawViewWalker.directChildren.Count > 0 ?
+							TreeWalker.RawViewWalker.directChildren [0] :
+							null;
+					}
+				else
+					firstChild = SourceManager.GetOrCreateAutomationElement (element.SourceElement.FirstChild);
+
+				return firstChild;
+			}
+
+			private AutomationElement GetLastDirectChild (AutomationElement element)
+			{
+				AutomationElement lastChild = null;
+
+				if (element == AutomationElement.RootElement)
+					lock (TreeWalker.RawViewWalker.directChildrenLock) {
+						lastChild = TreeWalker.RawViewWalker.directChildren.Count > 0 ?
+							TreeWalker.RawViewWalker.directChildren [TreeWalker.RawViewWalker.directChildren.Count - 1] :
+							null;
+					}
+				else
+					lastChild = SourceManager.GetOrCreateAutomationElement (element.SourceElement.LastChild);
+
+				return lastChild;
+			}
+
+			private AutomationElement GetNextDirectSibling (AutomationElement element)
+			{
+				AutomationElement parent = TreeWalker.RawViewWalker.GetParent (element);
+				AutomationElement nextSibling = null;
+
+				if (parent == AutomationElement.RootElement)
+					lock (TreeWalker.RawViewWalker.directChildrenLock) {
+						int nextIndex = TreeWalker.RawViewWalker.directChildren.IndexOf (element) + 1;
+						if (nextIndex > -1 && nextIndex < TreeWalker.RawViewWalker.directChildren.Count)
+							nextSibling = TreeWalker.RawViewWalker.directChildren [nextIndex];
+						else
+							nextSibling = null;
+					}
+				else
+					nextSibling = SourceManager.GetOrCreateAutomationElement (element.SourceElement.NextSibling);
+
+				return nextSibling;
+			}
+
+			private AutomationElement GetPreviousDirectSibling (AutomationElement element)
+			{
+				AutomationElement parent = TreeWalker.RawViewWalker.GetParent (element);
+				AutomationElement prevSibling = null;
+
+				if (parent == AutomationElement.RootElement)
+					lock (TreeWalker.RawViewWalker.directChildrenLock) {
+						int prevIndex = TreeWalker.RawViewWalker.directChildren.IndexOf (element) - 1;
+						if (prevIndex > -1)
+							prevSibling = TreeWalker.RawViewWalker.directChildren [prevIndex];
+						else
+							prevSibling = null;
+					}
+				else
+					prevSibling = SourceManager.GetOrCreateAutomationElement (element.SourceElement.PreviousSibling);
+
+				return prevSibling;
+			}
+			#endregion
+
+			#region Private Utility Methods
+			private void AddMarkedElement (AutomationElement element)
+			{
+				markedElements.Add (element);
+			}
+
+			/// <summary>
+			/// Iterate to the first matching child of an element
+			/// *after* the specified child.
+			/// </summary>
+			/// <param name="element">
+			/// The element whose children should be iterated.
+			/// </param>
+			/// <param name="afterThisChild">
+			/// The direct child of <paramref name="element"/>
+			/// after which to iterate, or null if the absolute first
+			/// matching child is desired.
+			/// </param>
+			/// <returns>
+			/// The first matching <see cref="AutomationElement"/>
+			/// after <paramref name="afterThisChild"/>.
+			/// </returns>
+			private AutomationElement GetFirstChild (AutomationElement element, AutomationElement afterThisChild)
+			{
+				if (element == null)
+					throw new ArgumentNullException ("element");
+				AddMarkedElement (element);
+
+				AutomationElement child;
+				if (afterThisChild == null)
+					child = GetFirstDirectChild (element);
+				else
+					child = GetNextDirectSibling (afterThisChild);
+				while (child != null && markedElements.Contains (child))
+					child = GetNextDirectSibling (child);
+				if (child == null || markedElements.Contains (child))
+					return null;
+
+				AutomationElement firstChild = null;
+				if (!markedElements.Contains (child) && condition.AppliesTo (child))
+					firstChild = child;
+				else {
+					firstChild = GetFirstChild (child);
+				}
+
+				while (firstChild == null && child != null) {
+					child = GetNextDirectSibling (child);
+					if (child == null)
+						return null;
+					firstChild = GetFirstChild (child);
+				}
+				return firstChild;
+			}
+
+			/// <summary>
+			/// Iterate to the last matching child of an element
+			/// *before* the specified child.
+			/// </summary>
+			/// <param name="element">
+			/// The element whose children should be iterated.
+			/// </param>
+			/// <param name="beforeThisChild">
+			/// The direct child of <paramref name="element"/>
+			/// before which to iterate, or null if the absolute last
+			/// matching child is desired.
+			/// </param>
+			/// <returns>
+			/// The last matching <see cref="AutomationElement"/>
+			/// before <paramref name="beforeThisChild"/>.
+			/// </returns>
+			private AutomationElement GetLastChild (AutomationElement element, AutomationElement beforeThisChild)
+			{
+				if (element == null)
+					throw new ArgumentNullException ("element");
+				AddMarkedElement (element);
+
+				AutomationElement child;
+				if (beforeThisChild == null)
+					child = GetLastDirectChild (element);
+				else
+					child = GetPreviousDirectSibling (beforeThisChild);
+				while (child != null && markedElements.Contains (child))
+					child = GetPreviousDirectSibling (child);
+				if (child == null || markedElements.Contains (child))
+					return null;
+
+				AutomationElement lastChild = null;
+				if (!markedElements.Contains (child) && condition.AppliesTo (child))
+					lastChild = child;
+				else {
+					lastChild = GetLastChild (child);
+				}
+
+				while (lastChild == null && child != null) {
+					child = GetPreviousDirectSibling (child);
+					if (child == null)
+						return null;
+					lastChild = GetLastChild (child);
+				}
+				return lastChild;
+			}
+			#endregion
+
+			#region Public Methods
+			public AutomationElement GetParent (AutomationElement element)
+			{
+				if (element == null)
+					throw new ArgumentNullException ("element");
+				else if (element == AutomationElement.RootElement)
+					return null;
+				AutomationElement ancestor =
+					SourceManager.GetOrCreateAutomationElement (element.SourceElement.Parent);
+
+				lock (TreeWalker.RawViewWalker.directChildrenLock)
+					if (ancestor == null && RawViewWalker.directChildren.Contains (element))
+						ancestor = SourceManager.GetOrCreateAutomationElement (AutomationElement.RootElement.SourceElement);
+
+				if (ancestor != null && !condition.AppliesTo (ancestor))
+					return GetParent (ancestor);
+				return ancestor;
+			}
+
+			public AutomationElement GetFirstChild (AutomationElement element)
+			{
+				return GetFirstChild (element, null);
+			}
+
+			public AutomationElement GetLastChild (AutomationElement element)
+			{
+				return GetLastChild (element, null);
+			}
+
+			public AutomationElement GetNextSibling (AutomationElement element)
+			{
+				if (element == null)
+					throw new ArgumentNullException ("element");
+				if (element == AutomationElement.RootElement)
+					return null;
+				AddMarkedElement (element);
+
+				AutomationElement sibling = GetNextDirectSibling (element);
+
+				AutomationElement previousParent = null;
+				if (sibling == null && condition != Automation.RawViewCondition) {
+					previousParent = TreeWalker.RawViewWalker.GetParent (element);
+					markedElements.Add (previousParent);
+					sibling = TreeWalker.RawViewWalker.GetParent (previousParent);
+				}
+
+				if (sibling == null)
+					return null;
+
+				AutomationElement nextSibling = null;
+				if (!markedElements.Contains (sibling) && condition.AppliesTo (sibling))
+					nextSibling = sibling;
+				else {
+					while (sibling != null && nextSibling == null && sibling != AutomationElement.RootElement) {
+						nextSibling = GetFirstChild (sibling, previousParent);
+						previousParent = sibling;
+						sibling = TreeWalker.RawViewWalker.GetParent (sibling);
+					}
+				}
+
+				return nextSibling;
+			}
+
+			public AutomationElement GetPreviousSibling (AutomationElement element)
+			{
+				if (element == null)
+					throw new ArgumentNullException ("element");
+				if (element == AutomationElement.RootElement)
+					return null;
+				AddMarkedElement (element);
+
+				AutomationElement sibling = GetPreviousDirectSibling (element);
+
+				AutomationElement previousParent = null;
+				if (sibling == null && condition != Automation.RawViewCondition) {
+					previousParent = TreeWalker.RawViewWalker.GetParent (element);
+					markedElements.Add (previousParent);
+					sibling = TreeWalker.RawViewWalker.GetParent (previousParent);
+				}
+
+				if (sibling == null)
+					return null;
+
+				AutomationElement prevSibling = null;
+				if (!markedElements.Contains (sibling) && condition.AppliesTo (sibling))
+					prevSibling = sibling;
+				else {
+					while (sibling != null && prevSibling == null && sibling != AutomationElement.RootElement) {
+						prevSibling = GetLastChild (sibling, previousParent);
+						previousParent = sibling;
+						sibling = TreeWalker.RawViewWalker.GetParent (sibling);
+					}
+				}
+
+				return prevSibling;
+			}
+			#endregion
+		}
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/TreeWalker.cs b/UIAutomationClient/System.Windows.Automation/TreeWalker.cs
new file mode 100644
index 0000000..2427401
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/TreeWalker.cs
@@ -0,0 +1,266 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+// 
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+
+using Mono.UIAutomation.Source;
+using Mono.UIAutomation.Services;
+
+namespace System.Windows.Automation
+{
+	public sealed partial class TreeWalker
+	{
+		#region Private Fields
+		private Object directChildrenLock = new Object ();
+		private List<AutomationElement> directChildren;
+		#endregion
+
+		#region Static Constructor
+		static TreeWalker ()
+		{
+			RawViewWalker = new TreeWalker (Automation.RawViewCondition);
+			InitializeRootElements ();
+
+			ControlViewWalker = new TreeWalker (Automation.ControlViewCondition);
+			ContentViewWalker = new TreeWalker (Automation.ContentViewCondition);
+		}
+		#endregion
+
+		#region Public Constructor
+		public TreeWalker (Condition condition)
+		{
+			if (condition == null)
+				throw new ArgumentNullException ("condition");
+			Condition = condition;
+		}
+		#endregion
+
+		#region Private Static Methods
+
+		private static void InitializeRootElements ()
+		{
+			lock (RawViewWalker.directChildrenLock) {
+				var pidElementMapping = new Dictionary<int, IElement> ();
+				RawViewWalker.directChildren = new List<AutomationElement> ();
+				foreach (IAutomationSource source in SourceManager.GetAutomationSources ()) {
+					AddUniqueRootElements (RawViewWalker.directChildren,
+					                       source,
+					                       pidElementMapping);
+					source.RootElementsChanged += (s, e) =>
+						OnSourceRootElementChanged (source);
+				}
+			}
+		}
+
+		private static void OnSourceRootElementChanged (IAutomationSource source)
+		{
+			lock (RawViewWalker.directChildrenLock) {
+				List<AutomationElement> rootElements = new List<AutomationElement> ();
+				var pidElementMapping = new Dictionary<int, IElement> ();
+				foreach (AutomationElement element in RawViewWalker.directChildren) {
+					if (element.SourceElement.AutomationSource != source) {
+						try {
+							pidElementMapping [element.Current.ProcessId] = element.SourceElement;
+						} catch { continue; } // TODO: ElementNotAvailableException
+						rootElements.Add (element);
+					}
+				}
+				// We don't handle the cleanup of AutomationElements here, they're
+				// handled by each AutomationSource.
+				// "Clean up" includes removing event handlers etc.
+				AddUniqueRootElements (rootElements, source, pidElementMapping);
+				RawViewWalker.directChildren = rootElements;
+			}
+			Log.Debug ("Root elements are refreshed, Count: {0}", RawViewWalker.directChildren.Count);
+		}
+
+		// TODO: This approach will completely break when the
+		//       MoonUiaDbusBridge work is committed. This code
+		//       will be replaced with proper source tree merging,
+		//       which requires updates to gtk-sharp.
+		private static void AddUniqueRootElements (List<AutomationElement> rootElements,
+		                                           IAutomationSource source,
+		                                           Dictionary<int, IElement> pidElementMapping)
+		{
+			const string at_spi = "at-spi";
+			foreach (IElement sourceElement in source.GetRootElements ()) {
+				int pid;
+				try {
+					pid = sourceElement.ProcessId;
+				} catch { continue; } // TODO: ElementNotAvailableException
+
+				IElement found;
+				// NOTE: This is not a complete mapping, since
+				//       one process could generate multiple root
+				//       elements. But it's sufficient to catch
+				//       that at least one element exists for
+				//       a given PID.
+				if (pidElementMapping.TryGetValue (pid, out found)) {
+					var sourceFid = sourceElement.FrameworkId;
+					var foundFid = found.FrameworkId;
+					// Ignore at-spi elements when elements
+					// for this process from a preferred
+					// framework exist
+					if (sourceFid == at_spi &&
+					    foundFid != at_spi)
+						continue;
+					// Remove at-spi elements when elements
+					// for this process from a preferred
+					// framework exist
+					else if (sourceFid != at_spi &&
+					         foundFid == at_spi) {
+						// TODO: When we fix ElementNotAvailableException,
+						//       we'll need to mark these
+						//       elements as unavailable.
+						rootElements.RemoveAll (e => e.Current.ProcessId == pid &&
+						                        e.Current.FrameworkId == at_spi);
+					}
+				}
+
+				rootElements.Add (
+					SourceManager.GetOrCreateAutomationElement (sourceElement));
+				pidElementMapping [pid] = sourceElement;
+			}
+		}
+
+		#endregion
+
+		#region Public Methods
+		public AutomationElement GetParent (AutomationElement element)
+		{
+			return new TreeIterator (Condition).GetParent (element);
+		}
+
+		public AutomationElement GetFirstChild (AutomationElement element)
+		{
+			return new TreeIterator (Condition).GetFirstChild (element);
+		}
+
+		public AutomationElement GetLastChild (AutomationElement element)
+		{
+			return new TreeIterator (Condition).GetLastChild (element);
+		}
+
+		public AutomationElement GetNextSibling (AutomationElement element)
+		{
+			return new TreeIterator (Condition).GetNextSibling (element);
+		}
+
+		public AutomationElement GetPreviousSibling (AutomationElement element)
+		{
+			return new TreeIterator (Condition).GetPreviousSibling (element);
+		}
+
+		public AutomationElement Normalize (AutomationElement element)
+		{
+			if (element == null)
+				throw new ArgumentNullException ("element");
+			if (Condition.AppliesTo (element))
+				return element;
+			if (element == AutomationElement.RootElement)
+				// LAMESPEC: This is according to MSDN:
+				// http://msdn.microsoft.com/en-us/library/system.windows.automation.treewalker.normalize.aspx
+//				return element;
+				// This is matching Microsoft's actual implementation:
+				return null;
+			return Normalize (RawViewWalker.GetParent (element));
+		}
+
+		public AutomationElement GetParent (AutomationElement element, CacheRequest request)
+		{
+			if (request == null)
+				throw new ArgumentNullException ("request");
+			var result = GetParent (element);
+			if (result != null)
+				return result.GetUpdatedCache (request);
+			return result;
+		}
+
+		public AutomationElement GetFirstChild (AutomationElement element, CacheRequest request)
+		{
+			if (request == null)
+				throw new ArgumentNullException ("request");
+			var result = GetFirstChild (element);
+			if (result != null)
+				return result.GetUpdatedCache (request);
+			return result;
+		}
+
+		public AutomationElement GetLastChild (AutomationElement element, CacheRequest request)
+		{
+			if (request == null)
+				throw new ArgumentNullException ("request");
+			var result = GetLastChild (element);
+			if (result != null)
+				return result.GetUpdatedCache (request);
+			return result;
+		}
+
+		public AutomationElement GetNextSibling (AutomationElement element, CacheRequest request)
+		{
+			if (request == null)
+				throw new ArgumentNullException ("request");
+			var result = GetNextSibling (element);
+			if (result != null)
+				return result.GetUpdatedCache (request);
+			return result;
+		}
+
+		public AutomationElement GetPreviousSibling (AutomationElement element, CacheRequest request)
+		{
+			if (request == null)
+				throw new ArgumentNullException ("request");
+			var result = GetPreviousSibling (element);
+			if (result != null)
+				return result.GetUpdatedCache (request);
+			return result;
+		}
+
+		public AutomationElement Normalize (AutomationElement element, CacheRequest request)
+		{
+			if (request == null)
+				throw new ArgumentNullException ("request");
+			var result = Normalize (element);
+			if (result != null)
+				return result.GetUpdatedCache (request);
+			return result;
+		}
+		#endregion
+
+		#region Public Properties
+		public Condition Condition { get; private set; }
+		#endregion
+
+		#region Public Static Fields
+		public static readonly TreeWalker RawViewWalker;
+
+		public static readonly TreeWalker ControlViewWalker;
+
+		public static readonly TreeWalker ContentViewWalker;
+		#endregion
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/ValuePattern.cs b/UIAutomationClient/System.Windows.Automation/ValuePattern.cs
new file mode 100644
index 0000000..469e438
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/ValuePattern.cs
@@ -0,0 +1,103 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class ValuePattern : BasePattern
+	{
+		public struct ValuePatternInformation
+		{
+			private bool cache;
+			private ValuePattern pattern;
+
+			internal ValuePatternInformation (ValuePattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public string Value {
+				get { return (string) pattern.element.GetPropertyValue (ValueProperty, cache); }
+			}
+
+			public bool IsReadOnly {
+				get { return (bool) pattern.element.GetPropertyValue (IsReadOnlyProperty, cache); }
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private ValuePatternInformation currentInfo;
+		private ValuePatternInformation cachedInfo;
+
+		internal ValuePattern ()
+		{
+		}
+
+		internal ValuePattern (IValuePattern source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new ValuePatternInformation (this, false);
+			if (cached)
+				cachedInfo = new ValuePatternInformation (this, true);
+		}
+
+		internal IValuePattern Source { get; private set; }
+
+		public ValuePatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public ValuePatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public void SetValue (string value)
+		{
+			Source.SetValue (value);
+		}
+
+		public static readonly AutomationPattern Pattern =
+			ValuePatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty ValueProperty =
+			ValuePatternIdentifiers.ValueProperty;
+
+		public static readonly AutomationProperty IsReadOnlyProperty =
+			ValuePatternIdentifiers.IsReadOnlyProperty;
+	}
+}
diff --git a/UIAutomationClient/System.Windows.Automation/WindowPattern.cs b/UIAutomationClient/System.Windows.Automation/WindowPattern.cs
new file mode 100644
index 0000000..487891b
--- /dev/null
+++ b/UIAutomationClient/System.Windows.Automation/WindowPattern.cs
@@ -0,0 +1,147 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using Mono.UIAutomation.Source;
+
+namespace System.Windows.Automation
+{
+	public class WindowPattern : BasePattern
+	{
+		public struct WindowPatternInformation
+		{
+			private bool cache;
+			private WindowPattern pattern;
+
+			internal WindowPatternInformation (WindowPattern pattern, bool cache)
+			{
+				this.pattern = pattern;
+				this.cache = cache;
+			}
+
+			public bool CanMaximize {
+				get { return (bool) pattern.element.GetPropertyValue (CanMaximizeProperty, cache); }
+			}
+
+			public bool CanMinimize {
+				get { return (bool) pattern.element.GetPropertyValue (CanMinimizeProperty, cache); }
+			}
+
+			public bool IsModal {
+				get { return (bool) pattern.element.GetPropertyValue (IsModalProperty, cache); }
+			}
+
+			public bool IsTopmost {
+				get { return (bool) pattern.element.GetPropertyValue (IsTopmostProperty, cache); }
+			}
+
+			public WindowVisualState WindowVisualState {
+				get { return (WindowVisualState) pattern.element.GetPropertyValue (WindowVisualStateProperty, cache); }
+			}
+
+			public WindowInteractionState WindowInteractionState {
+				get { return (WindowInteractionState) pattern.element.GetPropertyValue (WindowInteractionStateProperty, cache); }
+			}
+		}
+
+		private AutomationElement element;
+		private bool cached;
+		private WindowPatternInformation currentInfo;
+		private WindowPatternInformation cachedInfo;
+
+		internal WindowPattern ()
+		{
+		}
+
+		internal WindowPattern (IWindowPattern source, AutomationElement element, bool cached)
+		{
+			this.element = element;
+			this.cached = cached;
+			this.Source = source;
+			currentInfo = new WindowPatternInformation (this, false);
+			if (cached)
+				cachedInfo = new WindowPatternInformation (this, true);
+		}
+
+		internal IWindowPattern Source { get; private set; }
+
+		public WindowPatternInformation Cached {
+			get {
+				if (!cached)
+					throw new InvalidOperationException ("Cannot request a property or pattern that is not cached");
+				return cachedInfo;
+			}
+		}
+
+		public WindowPatternInformation Current {
+			get {
+				return currentInfo;
+			}
+		}
+
+		public bool WaitForInputIdle (int milliseconds)
+		{
+			return Source.WaitForInputIdle (milliseconds);
+		}
+
+		public void Close ()
+		{
+			Source.Close ();
+		}
+
+		public void SetWindowVisualState (WindowVisualState state)
+		{
+			Source.SetWindowVisualState (state);
+		}
+
+		public static readonly AutomationPattern Pattern =
+			WindowPatternIdentifiers.Pattern;
+
+		public static readonly AutomationProperty CanMaximizeProperty =
+			WindowPatternIdentifiers.CanMaximizeProperty;
+
+		public static readonly AutomationProperty CanMinimizeProperty =
+			WindowPatternIdentifiers.CanMinimizeProperty;
+
+		public static readonly AutomationProperty IsModalProperty =
+			WindowPatternIdentifiers.IsModalProperty;
+
+		public static readonly AutomationProperty IsTopmostProperty =
+			WindowPatternIdentifiers.IsTopmostProperty;
+
+		public static readonly AutomationProperty WindowVisualStateProperty =
+			WindowPatternIdentifiers.WindowVisualStateProperty;
+
+		public static readonly AutomationProperty WindowInteractionStateProperty =
+			WindowPatternIdentifiers.WindowInteractionStateProperty;
+
+		public static readonly AutomationEvent WindowOpenedEvent =
+			WindowPatternIdentifiers.WindowOpenedEvent;
+
+		public static readonly AutomationEvent WindowClosedEvent =
+			WindowPatternIdentifiers.WindowClosedEvent;
+	}
+}
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/AutomationElementTest.cs
similarity index 71%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/AutomationElementTest.cs
index b0fc424..2d8538d 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/AutomationElementTest.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiAutomationElementTest : AutomationElementTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
-		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+		public override bool Atspi {
+			get {
+				return true;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/AutomationEventTest.cs
similarity index 71%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/AutomationEventTest.cs
index b0fc424..594403b 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/AutomationEventTest.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiAutomationEventTest : AutomationEventTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
-		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+		public override bool Atspi {
+			get {
+				return true;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+}
 }
diff --git a/UIAutomationClientTests/AtspiUiaClientTests/DialogTest.cs b/UIAutomationClientTests/AtspiUiaClientTests/DialogTest.cs
new file mode 100644
index 0000000..4006126
--- /dev/null
+++ b/UIAutomationClientTests/AtspiUiaClientTests/DialogTest.cs
@@ -0,0 +1,88 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
+{
+	[TestFixture]
+	public class AtspiDialogTest : BaseTest
+	{
+		#region Test Methods
+		[Test]
+		public void Bug590768 ()
+		{
+			RunCommand ("open FileChooser");
+			AutomationElement chooser;
+			chooser = AutomationElement.RootElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"FileChooser"));
+			Assert.IsNull (chooser,
+				"Chooser should not be child of RootElement");
+			chooser = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"FileChooser"));
+			Assert.IsNotNull (chooser,
+				"FileChooser should be child of form");
+			Assert.AreEqual (chooser,
+				TreeWalker.RawViewWalker.GetLastChild (testFormElement),
+				"Chooser should be last TestForm child");
+			AutomationElement prev = TreeWalker.RawViewWalker.GetPreviousSibling (chooser);
+			Assert.IsNotNull (prev,
+				"Chooser PreviousSibling");
+			Assert.AreEqual (chooser,
+				TreeWalker.RawViewWalker.GetNextSibling (prev),
+				"chooser GetPrev -> getNext");
+			Assert.IsNull (TreeWalker.RawViewWalker.GetNextSibling (chooser),
+				"Chooser GetNext");
+			Assert.AreEqual (testFormElement,
+				TreeWalker.RawViewWalker.GetParent (chooser),
+				"chooser parent");
+			RunCommand ("close FileChooser");
+			chooser = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"FileChooser"));
+			Assert.IsNull (chooser,
+				"FileChooser should go away when closed");
+		}
+#endregion
+
+		public override bool Atspi {
+			get {
+				return true;
+			}
+		}
+	}
+}
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/ExpandCollapsePatternTest.cs
similarity index 70%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/ExpandCollapsePatternTest.cs
index b0fc424..955592b 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/ExpandCollapsePatternTest.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiExpandCollapsePatternTest : ExpandCollapsePatternTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
-		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+		public override bool Atspi {
+			get {
+				return true;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/FocusTest.cs
similarity index 72%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/FocusTest.cs
index b0fc424..885eb60 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/FocusTest.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiFocusTest : FocusTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
-		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+		public override bool Atspi {
+			get {
+				return true;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/InvokePatternTest.cs
similarity index 71%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/InvokePatternTest.cs
index b0fc424..23977d8 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/InvokePatternTest.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiInvokePatternTest : InvokePatternTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
-		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+		public override bool Atspi {
+			get {
+				return true;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+}
 }
diff --git a/UIAutomationClientTests/AtspiUiaClientTests/Makefile.am b/UIAutomationClientTests/AtspiUiaClientTests/Makefile.am
new file mode 100644
index 0000000..35e8122
--- /dev/null
+++ b/UIAutomationClientTests/AtspiUiaClientTests/Makefile.am
@@ -0,0 +1,158 @@
+
+EXTRA_DIST =  
+
+ASSEMBLY_COMPILER_COMMAND = gmcs
+ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -warnaserror -optimize+ -debug "-define:DEBUG"
+
+ASSEMBLY = bin/Debug/AtspiUiaClientTests.dll
+ASSEMBLY_MDB = $(ASSEMBLY).mdb
+COMPILE_TARGET = library
+BUILD_DIR = bin/Debug
+
+GTKFORM_EXE = $(BUILD_DIR)/GtkForm.exe
+GTKFORM_EXE_SOURCE=../GtkForm/bin/Debug/GtkForm.exe
+GTKFORM_EXE_MDB_SOURCE=$(GTKFORM_EXE_SOURCE).mdb
+GTKFORM_EXE_MDB=$(GTKFORM_EXE).mdb
+
+if HAS_MONO_2_5
+else
+WINDOWSBASE_DLL = $(BUILD_DIR)/WindowsBase.dll
+WINDOWSBASE_DLL_SOURCE=$(top_builddir)/bin/WindowsBase.dll
+WINDOWSBASE_DLL_MDB_SOURCE=$(WINDOWSBASE_DLL_SOURCE).mdb
+WINDOWSBASE_DLL_MDB=$(WINDOWSBASE_DLL).mdb
+endif
+
+UIAUTOMATIONTYPES_DLL = $(BUILD_DIR)/UIAutomationTypes.dll
+UIAUTOMATIONTYPES_DLL_SOURCE=$(top_builddir)/bin/UIAutomationTypes.dll
+UIAUTOMATIONTYPES_DLL_MDB_SOURCE=$(UIAUTOMATIONTYPES_DLL_SOURCE).mdb
+UIAUTOMATIONTYPES_DLL_MDB=$(UIAUTOMATIONTYPES_DLL).mdb
+
+UIAUTOMATIONCLIENT_DLL = $(BUILD_DIR)/UIAutomationClient.dll
+UIAUTOMATIONCLIENT_DLL_SOURCE=$(top_builddir)/bin/UIAutomationClient.dll
+UIAUTOMATIONCLIENT_DLL_MDB_SOURCE=$(UIAUTOMATIONCLIENT_DLL_SOURCE).mdb
+UIAUTOMATIONCLIENT_DLL_MDB=$(UIAUTOMATIONCLIENT_DLL).mdb
+
+#Needed by UIAutomationClient.dll
+UIAUTOMATIONSOURCE_DLL = $(BUILD_DIR)/UIAutomationSource.dll
+UIAUTOMATIONSOURCE_DLL_SOURCE=$(top_builddir)/bin/UIAutomationSource.dll
+UIAUTOMATIONSOURCE_DLL_MDB_SOURCE=$(UIAUTOMATIONSOURCE_DLL_SOURCE).mdb
+UIAUTOMATIONSOURCE_DLL_MDB=$(UIAUTOMATIONSOURCE_DLL).mdb
+
+#Needed by UIAutomationClient.dll
+UIAUTOMATIONPROVIDER_DLL = $(BUILD_DIR)/UIAutomationProvider.dll
+UIAUTOMATIONPROVIDER_DLL_SOURCE=$(top_builddir)/bin/UIAutomationProvider.dll
+UIAUTOMATIONPROVIDER_DLL_MDB_SOURCE=$(UIAUTOMATIONPROVIDER_DLL_SOURCE).mdb
+UIAUTOMATIONPROVIDER_DLL_MDB=$(UIAUTOMATIONPROVIDER_DLL).mdb
+
+UIAUTOMATIONCLIENTTESTS_DLL = $(BUILD_DIR)/UIAutomationClientTests.dll
+UIAUTOMATIONCLIENTTESTS_DLL_SOURCE=../UIAutomationClientTests/bin/Debug/UIAutomationClientTests.dll
+UIAUTOMATIONCLIENTTESTS_DLL_MDB_SOURCE=$(UIAUTOMATIONCLIENTTESTS_DLL_SOURCE).mdb
+UIAUTOMATIONCLIENTTESTS_DLL_MDB=$(UIAUTOMATIONCLIENTTESTS_DLL).mdb
+
+UIAUTOMATIONBRIDGE_DLL = $(BUILD_DIR)/UIAutomationBridge.dll
+UIAUTOMATIONBRIDGE_DLL_SOURCE=$(top_builddir)/bin/UIAutomationBridge.dll
+UIAUTOMATIONBRIDGE_DLL_MDB_SOURCE=$(UIAUTOMATIONBRIDGE_DLL_SOURCE).mdb
+UIAUTOMATIONBRIDGE_DLL_MDB=$(UIAUTOMATIONBRIDGE_DLL).mdb
+
+AL=al2
+
+PROGRAMFILES = \
+	$(GTKFORM_EXE) \
+	$(GTKFORM_EXE_MDB) \
+	$(WINDOWSBASE_DLL) \
+	$(WINDOWSBASE_DLL_MDB) \
+	$(UIAUTOMATIONTYPES_DLL) \
+	$(UIAUTOMATIONTYPES_DLL_MDB) \
+	$(UIAUTOMATIONCLIENT_DLL) \
+	$(UIAUTOMATIONCLIENT_DLL_MDB) \
+	$(UIAUTOMATIONSOURCE_DLL) \
+	$(UIAUTOMATIONSOURCE_DLL_MDB) \
+	$(UIAUTOMATIONPROVIDER_DLL) \
+	$(UIAUTOMATIONPROVIDER_DLL_MDB) \
+	$(UIAUTOMATIONBRIDGE_DLL) \
+	$(UIAUTOMATIONBRIDGE_DLL_MDB) \
+	$(UIAUTOMATIONCLIENTTESTS_DLL) \
+	$(UIAUTOMATIONCLIENTTESTS_DLL_MDB)
+
+RESGEN=resgen2
+	
+all: $(ASSEMBLY) $(PROGRAMFILES)
+
+FILES =  \
+	AutomationElementTest.cs \
+	AutomationEventTest.cs \
+	DialogTest.cs \
+	ExpandCollapsePatternTest.cs \
+	FocusTest.cs \
+	InvokePatternTest.cs \
+	MenuTest.cs \
+	RangeValuePatternTest.cs \
+	SelectionPatternTest.cs \
+	TableTest.cs \
+	TableHierarchyTest.cs \
+	TextPatternTest.cs \
+	TogglePatternTest.cs \
+	ValuePatternTest.cs
+
+DATA_FILES = 
+
+RESOURCES = 
+
+EXTRAS = 
+
+PROJECT_REFERENCES = \
+	$(WINDOWSBASE_DLL) \
+	$(UIAUTOMATIONTYPES_DLL) \
+	$(UIAUTOMATIONCLIENT_DLL) \
+	$(UIAUTOMATIONSOURCE_DLL) \
+	$(UIAUTOMATIONPROVIDER_DLL) \
+	$(UIAUTOMATIONBRIDGE_DLL) \
+	$(UIAUTOMATIONCLIENTTESTS_DLL)
+
+REFERENCES =  \
+	System \
+	System.Data \
+	Mono.Posix \
+	$(WINDOWSBASE_LIBS) \
+	$(NUNIT_LIBS)
+
+CLEANFILES = $(PROGRAMFILES) \
+	bin/Debug/TestResult.xml
+
+include $(top_srcdir)/Makefile.include
+
+$(eval $(call emit-deploy-target,GTKFORM_EXE))
+$(eval $(call emit-deploy-target,GTKFORM_EXE_MDB))
+
+if HAS_MONO_2_5
+else
+$(eval $(call emit-deploy-target,WINDOWSBASE_DLL))
+$(eval $(call emit-deploy-target,WINDOWSBASE_DLL_MDB))
+endif
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONTYPES_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONTYPES_DLL_MDB))
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONCLIENT_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONCLIENT_DLL_MDB))
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONSOURCE_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONSOURCE_DLL_MDB))
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONPROVIDER_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONPROVIDER_DLL_MDB))
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONBRIDGE_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONBRIDGE_DLL_MDB))
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONCLIENTTESTS_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONCLIENTTESTS_DLL_MDB))
+
+$(eval $(call emit_resgen_targets))
+$(build_xamlg_list): %.xaml.g.cs: %.xaml
+	xamlg '$<'
+
+$(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list)
+	@mkdir -p $(shell dirname $(ASSEMBLY))
+	$(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref)
+	@chmod +x atspiuiaclienttest.sh
diff --git a/UIAutomationBridge/Makefile.in b/UIAutomationClientTests/AtspiUiaClientTests/Makefile.in
similarity index 61%
copy from UIAutomationBridge/Makefile.in
copy to UIAutomationClientTests/AtspiUiaClientTests/Makefile.in
index 85e1266..28e6d72 100644
--- a/UIAutomationBridge/Makefile.in
+++ b/UIAutomationClientTests/AtspiUiaClientTests/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -17,8 +18,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -31,29 +33,44 @@ POST_INSTALL = :
 NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
-DIST_COMMON = $(srcdir)/AssemblyInfo.cs.in $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(top_srcdir)/Makefile.include ChangeLog
-subdir = UIAutomationBridge
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/atspiuiaclienttest.sh.in \
+	$(top_srcdir)/Makefile.include
+subdir = UIAutomationClientTests/AtspiUiaClientTests
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/expansions.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_CLEAN_FILES = AssemblyInfo.cs
-am__installdirs = "$(DESTDIR)$(bindir)" \
-	"$(DESTDIR)$(linuxpkgconfigdir)"
-binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-SCRIPTS = $(bin_SCRIPTS)
-SOURCES =
-DIST_SOURCES =
+CONFIG_CLEAN_FILES = atspiuiaclienttest.sh
+CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-linuxpkgconfigDATA_INSTALL = $(INSTALL_DATA)
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(linuxpkgconfigdir)"
+SCRIPTS = $(bin_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
 DATA = $(linuxpkgconfig_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -68,7 +85,11 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 GACUTIL = @GACUTIL@
+GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@
+GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@
 GMCS = @GMCS@
+GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@
+GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -98,6 +119,7 @@ SHELL = @SHELL@
 SN = @SN@
 STRIP = @STRIP@
 VERSION = @VERSION@
+WINDOWSBASE_LIBS = @WINDOWSBASE_LIBS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
@@ -144,38 +166,105 @@ EXTRA_DIST = $(build_sources) $(build_resx_files) \
 	$(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \
 	$(DATA_FILES) $(build_culture_res_files)
 ASSEMBLY_COMPILER_COMMAND = gmcs
-ASSEMBLY_COMPILER_FLAGS = -lib:@expanded_libdir@/mono/2.0 -lib:../bin -lib:@expanded_libdir@/mono/accessibility -noconfig -codepage:utf8 -warn:4 -warnaserror -optimize+ -debug "-define:DEBUG" -d:NET_2_0
-ASSEMBLY = ../bin/UIAutomationBridge.dll
+ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -warnaserror -optimize+ -debug "-define:DEBUG"
+ASSEMBLY = bin/Debug/AtspiUiaClientTests.dll
 ASSEMBLY_MDB = $(ASSEMBLY).mdb
 COMPILE_TARGET = library
-PROJECT_REFERENCES = 
-BUILD_DIR = ../bin
-PACKAGE_FLAG = /package accessibility
-UIAUTOMATIONBRIDGE_DLL_MDB_SOURCE = ../bin/UIAutomationBridge.dll.mdb
-UIAUTOMATIONBRIDGE_DLL_MDB = $(BUILD_DIR)/UIAutomationBridge.dll.mdb
+BUILD_DIR = bin/Debug
+GTKFORM_EXE = $(BUILD_DIR)/GtkForm.exe
+GTKFORM_EXE_SOURCE = ../GtkForm/bin/Debug/GtkForm.exe
+GTKFORM_EXE_MDB_SOURCE = $(GTKFORM_EXE_SOURCE).mdb
+GTKFORM_EXE_MDB = $(GTKFORM_EXE).mdb
+ at HAS_MONO_2_5_FALSE@WINDOWSBASE_DLL = $(BUILD_DIR)/WindowsBase.dll
+ at HAS_MONO_2_5_FALSE@WINDOWSBASE_DLL_SOURCE = $(top_builddir)/bin/WindowsBase.dll
+ at HAS_MONO_2_5_FALSE@WINDOWSBASE_DLL_MDB_SOURCE = $(WINDOWSBASE_DLL_SOURCE).mdb
+ at HAS_MONO_2_5_FALSE@WINDOWSBASE_DLL_MDB = $(WINDOWSBASE_DLL).mdb
+UIAUTOMATIONTYPES_DLL = $(BUILD_DIR)/UIAutomationTypes.dll
+UIAUTOMATIONTYPES_DLL_SOURCE = $(top_builddir)/bin/UIAutomationTypes.dll
+UIAUTOMATIONTYPES_DLL_MDB_SOURCE = $(UIAUTOMATIONTYPES_DLL_SOURCE).mdb
+UIAUTOMATIONTYPES_DLL_MDB = $(UIAUTOMATIONTYPES_DLL).mdb
+UIAUTOMATIONCLIENT_DLL = $(BUILD_DIR)/UIAutomationClient.dll
+UIAUTOMATIONCLIENT_DLL_SOURCE = $(top_builddir)/bin/UIAutomationClient.dll
+UIAUTOMATIONCLIENT_DLL_MDB_SOURCE = $(UIAUTOMATIONCLIENT_DLL_SOURCE).mdb
+UIAUTOMATIONCLIENT_DLL_MDB = $(UIAUTOMATIONCLIENT_DLL).mdb
+
+#Needed by UIAutomationClient.dll
+UIAUTOMATIONSOURCE_DLL = $(BUILD_DIR)/UIAutomationSource.dll
+UIAUTOMATIONSOURCE_DLL_SOURCE = $(top_builddir)/bin/UIAutomationSource.dll
+UIAUTOMATIONSOURCE_DLL_MDB_SOURCE = $(UIAUTOMATIONSOURCE_DLL_SOURCE).mdb
+UIAUTOMATIONSOURCE_DLL_MDB = $(UIAUTOMATIONSOURCE_DLL).mdb
+
+#Needed by UIAutomationClient.dll
+UIAUTOMATIONPROVIDER_DLL = $(BUILD_DIR)/UIAutomationProvider.dll
+UIAUTOMATIONPROVIDER_DLL_SOURCE = $(top_builddir)/bin/UIAutomationProvider.dll
+UIAUTOMATIONPROVIDER_DLL_MDB_SOURCE = $(UIAUTOMATIONPROVIDER_DLL_SOURCE).mdb
+UIAUTOMATIONPROVIDER_DLL_MDB = $(UIAUTOMATIONPROVIDER_DLL).mdb
+UIAUTOMATIONCLIENTTESTS_DLL = $(BUILD_DIR)/UIAutomationClientTests.dll
+UIAUTOMATIONCLIENTTESTS_DLL_SOURCE = ../UIAutomationClientTests/bin/Debug/UIAutomationClientTests.dll
+UIAUTOMATIONCLIENTTESTS_DLL_MDB_SOURCE = $(UIAUTOMATIONCLIENTTESTS_DLL_SOURCE).mdb
+UIAUTOMATIONCLIENTTESTS_DLL_MDB = $(UIAUTOMATIONCLIENTTESTS_DLL).mdb
+UIAUTOMATIONBRIDGE_DLL = $(BUILD_DIR)/UIAutomationBridge.dll
+UIAUTOMATIONBRIDGE_DLL_SOURCE = $(top_builddir)/bin/UIAutomationBridge.dll
+UIAUTOMATIONBRIDGE_DLL_MDB_SOURCE = $(UIAUTOMATIONBRIDGE_DLL_SOURCE).mdb
+UIAUTOMATIONBRIDGE_DLL_MDB = $(UIAUTOMATIONBRIDGE_DLL).mdb
 AL = al2
-SATELLITE_ASSEMBLY_NAME = Mono.UIAutomation.Bridge.resources.dll
 PROGRAMFILES = \
-	$(UIAUTOMATIONBRIDGE_DLL_MDB)  
+	$(GTKFORM_EXE) \
+	$(GTKFORM_EXE_MDB) \
+	$(WINDOWSBASE_DLL) \
+	$(WINDOWSBASE_DLL_MDB) \
+	$(UIAUTOMATIONTYPES_DLL) \
+	$(UIAUTOMATIONTYPES_DLL_MDB) \
+	$(UIAUTOMATIONCLIENT_DLL) \
+	$(UIAUTOMATIONCLIENT_DLL_MDB) \
+	$(UIAUTOMATIONSOURCE_DLL) \
+	$(UIAUTOMATIONSOURCE_DLL_MDB) \
+	$(UIAUTOMATIONPROVIDER_DLL) \
+	$(UIAUTOMATIONPROVIDER_DLL_MDB) \
+	$(UIAUTOMATIONBRIDGE_DLL) \
+	$(UIAUTOMATIONBRIDGE_DLL_MDB) \
+	$(UIAUTOMATIONCLIENTTESTS_DLL) \
+	$(UIAUTOMATIONCLIENTTESTS_DLL_MDB)
 
 RESGEN = resgen2
 FILES = \
-	AssemblyInfo.cs \
-	../build/common/*.cs \
-	Mono.UIAutomation.Bridge/IAutomationBridge.cs \
-	Mono.UIAutomation.Bridge/IHypertext.cs \
-	Mono.UIAutomation.Services/Log.cs
+	AutomationElementTest.cs \
+	AutomationEventTest.cs \
+	DialogTest.cs \
+	ExpandCollapsePatternTest.cs \
+	FocusTest.cs \
+	InvokePatternTest.cs \
+	MenuTest.cs \
+	RangeValuePatternTest.cs \
+	SelectionPatternTest.cs \
+	TableTest.cs \
+	TableHierarchyTest.cs \
+	TextPatternTest.cs \
+	TogglePatternTest.cs \
+	ValuePatternTest.cs
 
 DATA_FILES = 
 RESOURCES = 
+EXTRAS = 
+PROJECT_REFERENCES = \
+	$(WINDOWSBASE_DLL) \
+	$(UIAUTOMATIONTYPES_DLL) \
+	$(UIAUTOMATIONCLIENT_DLL) \
+	$(UIAUTOMATIONSOURCE_DLL) \
+	$(UIAUTOMATIONPROVIDER_DLL) \
+	$(UIAUTOMATIONBRIDGE_DLL) \
+	$(UIAUTOMATIONCLIENTTESTS_DLL)
+
 REFERENCES = \
-	WindowsBase \
 	System \
-	UIAutomationTypes
-
-DLL_REFERENCES = 
-CLEANFILES = $(PROGRAMFILES) $(ASSEMBLY) $(ASSEMBLY).mdb $(BINARIES) \
-	$(build_resx_resources) $(build_satellite_assembly_list)
+	System.Data \
+	Mono.Posix \
+	$(WINDOWSBASE_LIBS) \
+	$(NUNIT_LIBS)
+
+CLEANFILES = $(PROGRAMFILES) bin/Debug/TestResult.xml $(ASSEMBLY) \
+	$(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \
+	$(build_satellite_assembly_list)
 VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT
 s2q = $(subst \ ,?,$1)
 q2s = $(subst ?,\ ,$1)
@@ -253,14 +342,14 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(a
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  UIAutomationBridge/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  UIAutomationBridge/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign UIAutomationClientTests/AtspiUiaClientTests/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign UIAutomationClientTests/AtspiUiaClientTests/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -278,44 +367,63 @@ $(top_srcdir)/configure:  $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-AssemblyInfo.cs: $(top_builddir)/config.status $(srcdir)/AssemblyInfo.cs.in
+$(am__aclocal_m4_deps):
+atspiuiaclienttest.sh: $(top_builddir)/config.status $(srcdir)/atspiuiaclienttest.sh.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 install-binSCRIPTS: $(bin_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	    $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-binSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
 install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(linuxpkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)"
-	@list='$(linuxpkgconfig_DATA)'; for p in $$list; do \
+	@list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(linuxpkgconfigDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(linuxpkgconfigdir)/$$f'"; \
-	  $(linuxpkgconfigDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(linuxpkgconfigdir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(linuxpkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \
 	done
 
 uninstall-linuxpkgconfigDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(linuxpkgconfig_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(linuxpkgconfigdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(linuxpkgconfigdir)/$$f"; \
-	done
+	@list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(linuxpkgconfigdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(linuxpkgconfigdir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -339,13 +447,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -377,6 +489,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -396,26 +509,38 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
 
-install-data-am: install-data-local install-linuxpkgconfigDATA
+install-data-am: install-linuxpkgconfigDATA
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am: install-binSCRIPTS
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -434,31 +559,25 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA \
-	uninstall-local
+uninstall-am: uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA
 
 .MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic distclean \
 	distclean-generic distdir dvi dvi-am html html-am info info-am \
 	install install-am install-binSCRIPTS install-data \
-	install-data-am install-data-local install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-linuxpkgconfigDATA \
-	install-man install-pdf install-pdf-am install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
-	installdirs maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
-	uninstall-am uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA \
-	uninstall-local
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-linuxpkgconfigDATA install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
+	uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA
 
 
 all: $(ASSEMBLY) $(PROGRAMFILES)
 
-install-data-local: gac-install
-
-uninstall-local: gac-uninstall
-
 # macros
 
 # $(call emit-deploy-target,deploy-variable-name)
@@ -492,14 +611,39 @@ gac-install: $(POLICY_ASSEMBLIES)
 gac-uninstall:
 	$(GACUTIL) /us $(ASSEMBLY) $(GACUTIL_FLAGS) /root $(GACROOT) $(PACKAGE_FLAG) || exit 1;
 
+$(eval $(call emit-deploy-target,GTKFORM_EXE))
+$(eval $(call emit-deploy-target,GTKFORM_EXE_MDB))
+
+ at HAS_MONO_2_5_FALSE@$(eval $(call emit-deploy-target,WINDOWSBASE_DLL))
+ at HAS_MONO_2_5_FALSE@$(eval $(call emit-deploy-target,WINDOWSBASE_DLL_MDB))
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONTYPES_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONTYPES_DLL_MDB))
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONCLIENT_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONCLIENT_DLL_MDB))
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONSOURCE_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONSOURCE_DLL_MDB))
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONPROVIDER_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONPROVIDER_DLL_MDB))
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONBRIDGE_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONBRIDGE_DLL_MDB))
+
+$(eval $(call emit-deploy-target,UIAUTOMATIONCLIENTTESTS_DLL))
+$(eval $(call emit-deploy-target,UIAUTOMATIONCLIENTTESTS_DLL_MDB))
+
 $(eval $(call emit_resgen_targets))
 $(build_xamlg_list): %.xaml.g.cs: %.xaml
 	xamlg '$<'
 
 $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list)
-	mkdir -p $(shell dirname $(ASSEMBLY))
+	@mkdir -p $(shell dirname $(ASSEMBLY))
 	$(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref)
-	sn -q -R $(ASSEMBLY) $(top_srcdir)/mono.snk
+	@chmod +x atspiuiaclienttest.sh
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/MenuTest.cs
similarity index 51%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/MenuTest.cs
index b0fc424..60560a2 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/MenuTest.cs
@@ -20,31 +20,50 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiMenuTest : MenuTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
+		[Test]
+		public void CheckMenuItemTest ()
 		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+			AutomationElement file = TreeWalker.RawViewWalker.GetFirstChild (horizontalMenuStripElement);
+			Assert.IsNotNull (file, "File");
+			Assert.AreEqual ("File", file.Current.Name, "File name");
+
+			AutomationElement check = file.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"Check"));
+			Assert.IsNotNull (check, "Check MenuItem found");
+			Assert.AreEqual ("ControlType.MenuItem",
+				check.Current.ControlType.ProgrammaticName,
+				"ControlType");
+			VerifyPatterns (check,
+				InvokePatternIdentifiers.Pattern,
+				SelectionItemPatternIdentifiers.Pattern,
+				TogglePatternIdentifiers.Pattern);
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+
+		public override bool Atspi {
+			get {
+				return true;
+			}
+		}
+}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/RangeValuePatternTest.cs
similarity index 71%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/RangeValuePatternTest.cs
index b0fc424..a0d4975 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/RangeValuePatternTest.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiRangeValuePatternTest : RangeValuePatternTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
-		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+		public override bool Atspi {
+			get {
+				return true;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/SelectionPatternTest.cs
similarity index 71%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/SelectionPatternTest.cs
index b0fc424..79d72b7 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/SelectionPatternTest.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiSelectionPatternTest : SelectionPatternTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
-		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+		public override bool Atspi {
+			get {
+				return true;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/EditableRangePatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/TableHierarchyTest.cs
similarity index 51%
copy from UIAutomationTypes/System.Windows.Automation/EditableRangePatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/TableHierarchyTest.cs
index b702934..5ea5511 100644
--- a/UIAutomationTypes/System.Windows.Automation/EditableRangePatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/TableHierarchyTest.cs
@@ -20,31 +20,50 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
 
-namespace System.Windows.Automation
+namespace AtspiUiaClientTests
 {
-	internal static class EditableRangePatternIdentifiers
+	[TestFixture]
+	public class AtspiTableHierarchyTest : TableHierarchyTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70003;
-		
-		static EditableRangePatternIdentifiers ()
+		[Test]
+		public void DataItemPatternTest ()
 		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "EditableRangePatternIdentifiers.Pattern");
+			AutomationElement treeView2Element
+				= groupBoxElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"treeView2"));
+			AutomationElement dataItemElement
+				= treeView2Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.DataItem));
+			Assert.IsNotNull (dataItemElement,
+				"DataItem not found");
+			VerifyPatterns (dataItemElement,
+				ExpandCollapsePatternIdentifiers.Pattern,
+				GridPatternIdentifiers.Pattern,
+				SelectionPatternIdentifiers.Pattern,
+				TablePatternIdentifiers.Pattern);
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+
+		public override bool Atspi {
+			get {
+				return true;
+			}
+		}
+}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/TableTest.cs
similarity index 72%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/TableTest.cs
index b0fc424..ecae3fe 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/TableTest.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiTableTest : TableTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
-		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+		public override bool Atspi {
+			get {
+				return true;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/TextPatternTest.cs
similarity index 71%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/TextPatternTest.cs
index b0fc424..bac4c28 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/TextPatternTest.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiTextPatternTest : TextPatternTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
-		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+		public override bool Atspi {
+			get {
+				return true;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/TogglePatternTest.cs
similarity index 71%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/TogglePatternTest.cs
index b0fc424..7cd49da 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/TogglePatternTest.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiTogglePatternTest : TogglePatternTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
-		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+		public override bool Atspi {
+			get {
+				return true;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+}
 }
diff --git a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs b/UIAutomationClientTests/AtspiUiaClientTests/ValuePatternTest.cs
similarity index 71%
copy from UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
copy to UIAutomationClientTests/AtspiUiaClientTests/ValuePatternTest.cs
index b0fc424..e59ffb5 100644
--- a/UIAutomationTypes/System.Windows.Automation/CaretPatternIdentifiers.cs
+++ b/UIAutomationClientTests/AtspiUiaClientTests/ValuePatternTest.cs
@@ -20,31 +20,30 @@
 // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//	Mario Carrion <mcarrion at novell.com>
+//  Mike Gorse <mgorse at novell.com>
 // 
+
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+//using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
 
-namespace System.Windows.Automation
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace AtspiUiaClientTests
 {
-	internal static class CaretPatternIdentifiers
+	[TestFixture]
+	public class AtspiValuePatternTest : ValuePatternTest
 	{
-		#region Constructor
-		
-		private const int PatternId = 70005;
-		
-		static CaretPatternIdentifiers ()
-		{
-			Pattern =
-				new AutomationPattern (PatternId,
-				                       "CaretPatternIdentifiers.Pattern");
+		public override bool Atspi {
+			get {
+				return true;
+			}
 		}
-		
-		#endregion
-		
-		#region Public Fields
-		
-		public static readonly AutomationPattern Pattern;
-		
-		#endregion
-	}
+}
 }
diff --git a/UIAutomationClientTests/AtspiUiaClientTests/atspiuiaclienttest.sh.in b/UIAutomationClientTests/AtspiUiaClientTests/atspiuiaclienttest.sh.in
new file mode 100644
index 0000000..6ac294f
--- /dev/null
+++ b/UIAutomationClientTests/AtspiUiaClientTests/atspiuiaclienttest.sh.in
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+DLL=AtspiUiaClientTests.dll
+
+TEST_DISPLAY=:99
+NUNIT_FLAGS="-nothread -noshadow"
+
+while getopts f:xd:t:l o
+do case "$o" in
+    x)  xephyr="yes";;
+    d)  optdisplay="$OPTARG" && xephyr="yes";;
+    f)  fixture="$OPTARG";;
+    t)  runtest="$OPTARG" && test "x$fixture" != "x";;
+    l)  labels="yes";;
+    \?)  echo "Usage: $0 -x -l -d <display> -f <fixture> -t <test>" && exit 1;;
+esac
+done
+
+if [ "x$optdisplay" != "x" ]; then
+	TEST_DISPLAY=:$optdisplay
+fi
+
+# Reset $@
+shift `echo $OPTIND-1 | bc`
+NUNIT_ARGS=$*
+
+if [ "x$fixture" != "x" ]; then
+	echo "Running only the unit tests for fixture $fixture..."
+	echo
+
+	NUNIT_ARGS="--fixture=AtspiUiaClientTests.Atspi${fixture}"
+fi
+
+if [ "x$runtest" != "x" ]; then
+	echo "Running only the unit test $runtest from $fixture"
+	echo
+
+	NUNIT_ARGS="${NUNIT_ARGS} --run=AtspiUiaClientTests.Atspi${fixture}.${runtest}"
+fi
+
+if [ "x$xephyr" == "xyes" ]; then
+	Xephyr -ac -screen 800x600 -br -reset -terminate $TEST_DISPLAY &
+	xephyr_pid=$!
+
+	export DISPLAY=$TEST_DISPLAY
+
+	gnome-session &
+	metacity &
+	metacity_pid=$!
+fi
+
+if [ "x$labels" == "xyes" ]; then
+	NUNIT_FLAGS="${NUNIT_FLAGS} -labels"
+fi
+
+(cd bin/Debug; \
+	@MONO@ --debug @NUNIT_PATH@/nunit-console.exe ${NUNIT_FLAGS} ${DLL} ${NUNIT_ARGS})
+
+if [ "x$xephyr" == "xyes" ]; then
+	kill $metacity_pid $xephyr_pid
+fi
diff --git a/UIAutomationClientTests/GtkForm/GtkForm.cs b/UIAutomationClientTests/GtkForm/GtkForm.cs
new file mode 100644
index 0000000..5f38bdb
--- /dev/null
+++ b/UIAutomationClientTests/GtkForm/GtkForm.cs
@@ -0,0 +1,294 @@
+using System;
+
+using Gtk;
+
+namespace GtkForm
+{
+	public class DemoMain
+	{
+		private Gtk.Window window;
+		private Gtk.HBox hbox1;
+		private Gtk.Label label1;
+		private Gtk.Entry textBox1;
+		private Gtk.TextView textBox3;
+		private Gtk.TreeView treeView1;
+		private Gtk.TreeView treeView2;
+		private Gtk.TreeView listView1;
+		private Gtk.TreeView dataGridView1;
+		private Gtk.TreeStore tableStore;
+		private Gtk.ScaleButton scaleButton1;
+		private Gtk.HBox hboxPanel;
+		private Gtk.Entry textBoxExtra;
+		private Gtk.Entry txtCommand;
+		private Gtk.Button button1;
+		private Gtk.Button button2;
+		private Gtk.Button button3;
+		private Gtk.FileChooserDialog chooser;
+
+		public static void Main (string[] args)
+		{
+			Application.Init ();
+			new DemoMain ();
+			Application.Run ();
+		}
+
+		public DemoMain ()
+		{
+			window = new Gtk.Window ("TestForm1");
+			Gtk.HBox hbox = new Gtk.HBox (false, 0);
+			hbox1 = new Gtk.HBox (false, 0);
+			Gtk.HBox hbox2 = new Gtk.HBox (false, 0);
+			Gtk.HBox hbox3 = new Gtk.HBox (false, 0);
+			hbox.Add (hbox1);
+			window.SetDefaultSize (600, 400);
+			window.DeleteEvent += new DeleteEventHandler (WindowDelete);
+
+			button1 = new Gtk.Button ("button1");
+			button1.Clicked += Button1Clicked;
+			button2 = new Gtk.Button ("button2");
+			button3 = new Gtk.Button ("button3");
+			Gtk.Button button4 = new Gtk.Button ("button4");
+			button4.Clicked += Button4Clicked;
+			Gtk.Button button5 = new Gtk.Button ("button5");
+			Gtk.Button button6 = new Gtk.Button ("button6");
+			Gtk.Button button7 = new Gtk.Button ("button7");
+			button7.Sensitive = false;
+
+			scaleButton1 = new Gtk.ScaleButton (0, 0, 100, 10, new string [0]);
+
+			hbox1.Add (hbox3);
+			hbox1.Add (hbox2);
+			hbox1.Add (button3);
+			hbox1.Add (button2);
+
+			button3.Accessible.Description = "help text 3";
+			button3.Sensitive = false;
+
+			label1 = new Gtk.Label ("label1");
+
+			textBox1 = new Gtk.Entry ();
+			Gtk.Entry textBox2 = new Gtk.Entry ();
+			textBox2.Visibility = false;
+			textBox2.Sensitive = false;
+			textBox2.IsEditable = false;
+			textBox3 = new Gtk.TextView ();
+			// TODO: scrollbars
+			Gtk.CheckButton checkbox1 = new Gtk.CheckButton ("checkbox1");
+			Gtk.CheckButton checkbox2 = new Gtk.CheckButton ("checkbox2");
+			checkbox2.Sensitive = false;
+
+			Gtk.TreeStore store = new Gtk.TreeStore (typeof (string), typeof (string));
+			Gtk.TreeIter [] iters = new Gtk.TreeIter [2];
+			iters [0] = store.AppendNode ();
+			store.SetValues (iters [0], "item 1", "item 1 (2)");
+			iters [1] = store.AppendNode (iters [0]);
+			store.SetValues (iters [1], "item 1a", "item 1a (2)");
+			iters [0] = store.AppendNode ();
+			store.SetValues (iters [0], "item 2", "item 2 (2)");
+			iters [1] = store.AppendNode (iters [0]);
+			store.SetValues (iters [1], "item 2a", "item 2a (2)");
+			iters [1] = store.AppendNode (iters [0]);
+			store.SetValues (iters [1], "item 2b", "item 2b (2)");
+			treeView1 = new Gtk.TreeView (store);
+			AddTreeViewColumn (treeView1, 0, "column 1");
+			treeView1.CollapseAll ();
+
+			treeView2 = new Gtk.TreeView (store);
+			AddTreeViewColumn (treeView2, 0, "column 1");
+			AddTreeViewColumn (treeView2, 1, "column 2");
+			treeView2.CollapseAll ();
+			treeView2.Accessible.Name = "treeView2";
+
+			tableStore = new Gtk.TreeStore (typeof (string), typeof (string), typeof (string), typeof (string));
+			iters [0] = tableStore.AppendNode ();
+			tableStore.SetValues (iters [0], "False", "Alice", "24", "");
+			iters [0] = tableStore.AppendNode ();
+			tableStore.SetValues (iters [0], "True", "Bob", "28", "");
+			dataGridView1 = new Gtk.TreeView (tableStore);
+			AddTreeViewColumn (dataGridView1, 0, "Gender");
+			AddTreeViewColumn (dataGridView1, 1, "Name");
+			AddTreeViewColumn (dataGridView1, 2, "Age");
+			dataGridView1.Accessible.Name = "dataGridView1";
+
+			hboxPanel = new Gtk.HBox ();
+			Gtk.Button btnRemoveTextBox = new Gtk.Button ("Remove");
+			btnRemoveTextBox.Clicked += RemoveTextBoxClicked;
+			Gtk.Button btnAddTextBox = new Gtk.Button ("Add");
+			btnAddTextBox.Clicked += AddTextBoxClicked;
+			txtCommand = new Gtk.Entry ();
+			txtCommand.Accessible.Name = "txtCommand";
+			Gtk.Button btnRun = new Gtk.Button ("Run");
+			btnRun.Clicked += btnRunClicked;
+			hboxPanel.Add (btnRemoveTextBox);
+			hboxPanel.Add (btnAddTextBox);
+
+			Gtk.TreeStore treeStore = new Gtk.TreeStore (typeof (string));
+			Gtk.TreeIter iter = treeStore.AppendNode ();
+			treeStore.SetValue (iter, 0, "Item 0");
+			iter = treeStore.AppendNode ();
+			treeStore.SetValue (iter, 0, "Item 1");
+			listView1 = new Gtk.TreeView (treeStore);
+			AddTreeViewColumn (listView1, 0, "items");
+			listView1.Accessible.Name = "listView1";
+			listView1.ExpandAll ();
+
+			hbox2.Add (button5);
+			hbox2.Add (checkbox1);
+			hbox2.Add (checkbox2);
+			hbox2.Add (button4);
+			hbox2.Accessible.Name = "groupBox2";
+
+			hbox3.Add (button7);
+			hbox3.Add (button6);
+			hbox3.Sensitive = false;
+			hbox3.Accessible.Name = "groupBox3";
+
+			hbox.Add (textBox3);
+			hbox.Add (textBox2);
+			hbox.Add (textBox1);
+			hbox.Add (label1);
+			hbox.Add (button1);
+			hbox.Add (treeView1);
+			hbox.Add (treeView2);
+			hbox.Add (listView1);
+			hbox.Add (dataGridView1);
+			hbox.Add (txtCommand);
+			hbox.Add (btnRun);
+			hbox.Add (hboxPanel);
+			hbox.Add (scaleButton1);
+
+			Gtk.Menu file = new Gtk.Menu ();
+			file.Append (new Gtk.MenuItem ("_New"));
+			file.Append (new Gtk.MenuItem ("_Open"));
+			file.Append (new Gtk.CheckMenuItem ("Check"));
+			Gtk.MenuItem fileItem = new Gtk.MenuItem ("File");
+			fileItem.Submenu = file;
+			Gtk.Menu edit = new Gtk.Menu ();
+			edit.Append (new Gtk.MenuItem ("_Undo"));
+			edit.Append (new Gtk.SeparatorMenuItem ());
+			edit.Append (new Gtk.MenuItem ("_Cut"));
+			edit.Append (new Gtk.MenuItem ("Copy"));
+			edit.Append (new Gtk.MenuItem ("_Paste"));
+			Gtk.MenuItem editItem = new Gtk.MenuItem ("Edit");
+			editItem.Submenu = edit;
+			Gtk.MenuBar menuBar = new Gtk.MenuBar ();
+			menuBar.Append (fileItem);
+			menuBar.Append (editItem);
+			hbox.Add (menuBar);
+
+			window.Add (hbox);
+			window.ShowAll ();
+		}
+
+		private void AddTreeViewColumn (Gtk.TreeView treeView, int i, string name)
+		{
+			AddTreeViewColumn (treeView, i, name, false);
+		}
+
+		private void AddTreeViewColumn (Gtk.TreeView treeView, int i, string name, bool toggle)
+		{
+			Gtk.TreeViewColumn col = new Gtk.TreeViewColumn ();
+			col.Title = name;
+			treeView.AppendColumn (col);
+			Gtk.CellRenderer cell;
+			if (toggle)
+				cell = new Gtk.CellRendererToggle ();
+			else
+				cell = new Gtk.CellRendererText ();
+			col.PackStart (cell, true);
+			col.AddAttribute (cell, "text", i);
+		}
+
+		private void Button1Clicked (object o, EventArgs args)
+		{
+			textBox1.Text = "button1_click";
+			label1.Text = "button1_click";
+		}
+
+		private void Button4Clicked (object o, EventArgs args)
+		{
+			treeView1.Sensitive = !treeView1.Sensitive;
+			treeView2.Sensitive = !treeView2.Sensitive;
+			scaleButton1.Sensitive = !scaleButton1.Sensitive;
+		}
+
+		private void RemoveTextBoxClicked (object o, EventArgs args)
+		{
+			if (textBoxExtra == null)
+				throw new Exception ("No textBox to remove");
+			hboxPanel.Remove (textBoxExtra);
+			textBoxExtra = null;
+		}
+
+		private void AddTextBoxClicked (object o, EventArgs args)
+		{
+			if (textBoxExtra != null)
+				throw new Exception ("Adding more than one TextBox not supported");
+			textBoxExtra = new Gtk.Entry ();
+			hboxPanel.Add (textBoxExtra);
+		}
+
+		private void btnRunClicked (object o, EventArgs args)
+		{
+			const string sampleText = "Lorem ipsum dolor sit amet";
+
+			string cmd = txtCommand.Text;
+			if (cmd == "click button1")
+				button1.Activate ();
+			else if (cmd == "set textbox3 text")
+				textBox3.Buffer.Text = sampleText;
+			else if (cmd == "select textbox3") {
+				if (textBox3.Buffer.Text.Length < 4)
+					textBox3.Buffer.Text = sampleText;
+				Gtk.TextIter startIter, endIter;
+				textBox3.Buffer.GetSelectionBounds (out startIter, out endIter);
+				int start, end;
+				start = startIter.Offset;
+				end = endIter.Offset;
+				end = (end-start == 3? 4: 3);
+				start = 0;
+				startIter = textBox3.Buffer.GetIterAtOffset (start);
+				endIter = textBox3.Buffer.GetIterAtOffset (end);
+				textBox3.Buffer.MoveMark ("selection_bound", startIter);
+				textBox3.Buffer.MoveMark ("insert", endIter);
+			} else if (cmd == "add table row") {
+				Gtk.TreeIter iter;
+				iter = tableStore.AppendNode ();
+				tableStore.SetValues (iter, "true", "Mallory", "40");
+			} else if (cmd == "add table column")
+			AddTreeViewColumn (treeView2, 3, "more");
+			else if (cmd == "enable multiselect")
+				listView1.Selection.Mode = Gtk.SelectionMode.Multiple;
+			else if (cmd == "disable multiselect")
+				listView1.Selection.Mode = Gtk.SelectionMode.Single;
+			else if (cmd == "change button3 name")
+				button3.Accessible.Name = "xyzzy";
+			else if (cmd == "change button3 helptext")
+				button3.Accessible.Description = "plugh";
+			else if (cmd == "enable button3")
+				button3.Sensitive = true;
+			else if (cmd == "disable button3")
+				button3.Sensitive = false;
+			else if (cmd == "focus textBox3")
+				textBox3.GrabFocus ();
+			else if (cmd == "focus button2")
+				button2.GrabFocus ();
+			else if (cmd.StartsWith ("change title:"))
+				window.Title = cmd.Substring (cmd.IndexOf (':') + 1);
+			else if (cmd == "open FileChooser" && chooser == null) {
+				chooser = new Gtk.FileChooserDialog ("FileChooser", window, FileChooserAction.Open, "data", 0);
+				chooser.Show ();
+			}
+			else if (cmd == "close FileChooser" && chooser != null) {
+				chooser.Destroy ();
+				chooser = null;
+			}
+		}
+
+		private void WindowDelete (object o, DeleteEventArgs args)
+		{
+			Application.Quit ();
+			args.RetVal = true;
+		}
+	}
+}
diff --git a/WindowsBase/Makefile.am b/UIAutomationClientTests/GtkForm/Makefile.am
similarity index 51%
copy from WindowsBase/Makefile.am
copy to UIAutomationClientTests/GtkForm/Makefile.am
index 4f646b3..0f99650 100644
--- a/WindowsBase/Makefile.am
+++ b/UIAutomationClientTests/GtkForm/Makefile.am
@@ -1,24 +1,38 @@
+EXTRA_DIST =
 
-EXTRA_DIST =  
-
+if ENABLE_DEBUG
 ASSEMBLY_COMPILER_COMMAND = gmcs
-ASSEMBLY_COMPILER_FLAGS = -lib:@expanded_libdir@/mono/2.0 -noconfig -codepage:utf8 -warn:4 -warnaserror -optimize+ -debug "-define:DEBUG" -d:NET_2_0
+ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug "-define:DEBUG"
 
-ASSEMBLY = ../bin/WindowsBase.dll
+ASSEMBLY = bin/Debug/GtkForm.exe
 ASSEMBLY_MDB = $(ASSEMBLY).mdb
-COMPILE_TARGET = library
+COMPILE_TARGET = exe
+PROJECT_REFERENCES = 
+BUILD_DIR = bin/Debug
+
+GTKFORM_EXE_MDB_SOURCE=bin/Debug/GtkForm.exe.mdb
+GTKFORM_EXE_MDB=$(BUILD_DIR)/GtkForm.exe.mdb
+
+endif
+
+if ENABLE_RELEASE
+ASSEMBLY_COMPILER_COMMAND = gmcs
+ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -keyfile:$(top_srcdir)/mono-uia.snk
+ASSEMBLY = bin/Release/GtkForm.exe
+ASSEMBLY_MDB = 
+COMPILE_TARGET = exe
 PROJECT_REFERENCES = 
-BUILD_DIR = ../bin
-PACKAGE_FLAG = /package 2.0
+BUILD_DIR = bin/Release
+
+GTKFORM_EXE_MDB=
 
-WINDOWSBASE_DLL_MDB_SOURCE=$(BUILD_DIR)/WindowsBase.dll.mdb
-WINDOWSBASE_DLL_MDB=$(BUILD_DIR)/WindowsBase.dll.mdb
+endif
 
 AL=al2
-SATELLITE_ASSEMBLY_NAME=
+SATELLITE_ASSEMBLY_NAME=.resources.dll
 
 PROGRAMFILES = \
-	$(WINDOWSBASE_DLL_MDB)  
+	$(GTKFORM_EXE_MDB)  
 
 
 RESGEN=resgen2
@@ -26,29 +40,24 @@ RESGEN=resgen2
 all: $(ASSEMBLY) $(PROGRAMFILES)
 
 FILES =  \
-        AssemblyInfo.cs \
-        ../build/common/*.cs \
-	System.Windows/Point.cs \
-	System.Windows/Rect.cs \
-	System.Windows/Size.cs \
-	System.Windows/Vector.cs \
-	System.Windows.Media/Matrix.cs
+	GtkForm.cs
 
 DATA_FILES = 
 
 RESOURCES =
 
+EXTRAS = 
+
 REFERENCES =  \
-	System
+	System \
+	Mono.Posix \
+	System.Core \
+	$(GTK_SHARP_20_LIBS)
 
 DLL_REFERENCES = 
 
 CLEANFILES = $(PROGRAMFILES)
 
-install-data-local: gac-install
-
-uninstall-local: gac-uninstall
-
 include $(top_srcdir)/Makefile.include
 
 
@@ -59,4 +68,3 @@ $(build_xamlg_list): %.xaml.g.cs: %.xaml
 $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list)
 	mkdir -p $(shell dirname $(ASSEMBLY))
 	$(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref)
-	sn -q -R $(ASSEMBLY) $(top_srcdir)/mono.snk
diff --git a/UIAutomationBridge/Makefile.in b/UIAutomationClientTests/GtkForm/Makefile.in
similarity index 72%
copy from UIAutomationBridge/Makefile.in
copy to UIAutomationClientTests/GtkForm/Makefile.in
index 85e1266..fd5df5f 100644
--- a/UIAutomationBridge/Makefile.in
+++ b/UIAutomationClientTests/GtkForm/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -17,8 +18,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -31,29 +33,43 @@ POST_INSTALL = :
 NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
-DIST_COMMON = $(srcdir)/AssemblyInfo.cs.in $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(top_srcdir)/Makefile.include ChangeLog
-subdir = UIAutomationBridge
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Makefile.include
+subdir = UIAutomationClientTests/GtkForm
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/expansions.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_CLEAN_FILES = AssemblyInfo.cs
-am__installdirs = "$(DESTDIR)$(bindir)" \
-	"$(DESTDIR)$(linuxpkgconfigdir)"
-binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-SCRIPTS = $(bin_SCRIPTS)
-SOURCES =
-DIST_SOURCES =
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-linuxpkgconfigDATA_INSTALL = $(INSTALL_DATA)
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(linuxpkgconfigdir)"
+SCRIPTS = $(bin_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
 DATA = $(linuxpkgconfig_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -68,7 +84,11 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 GACUTIL = @GACUTIL@
+GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@
+GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@
 GMCS = @GMCS@
+GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@
+GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -98,6 +118,7 @@ SHELL = @SHELL@
 SN = @SN@
 STRIP = @STRIP@
 VERSION = @VERSION@
+WINDOWSBASE_LIBS = @WINDOWSBASE_LIBS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
@@ -143,35 +164,40 @@ top_srcdir = @top_srcdir@
 EXTRA_DIST = $(build_sources) $(build_resx_files) \
 	$(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \
 	$(DATA_FILES) $(build_culture_res_files)
-ASSEMBLY_COMPILER_COMMAND = gmcs
-ASSEMBLY_COMPILER_FLAGS = -lib:@expanded_libdir@/mono/2.0 -lib:../bin -lib:@expanded_libdir@/mono/accessibility -noconfig -codepage:utf8 -warn:4 -warnaserror -optimize+ -debug "-define:DEBUG" -d:NET_2_0
-ASSEMBLY = ../bin/UIAutomationBridge.dll
-ASSEMBLY_MDB = $(ASSEMBLY).mdb
-COMPILE_TARGET = library
-PROJECT_REFERENCES = 
-BUILD_DIR = ../bin
-PACKAGE_FLAG = /package accessibility
-UIAUTOMATIONBRIDGE_DLL_MDB_SOURCE = ../bin/UIAutomationBridge.dll.mdb
-UIAUTOMATIONBRIDGE_DLL_MDB = $(BUILD_DIR)/UIAutomationBridge.dll.mdb
+ at ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_COMMAND = gmcs
+ at ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_COMMAND = gmcs
+ at ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug "-define:DEBUG"
+ at ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -keyfile:$(top_srcdir)/mono-uia.snk
+ at ENABLE_DEBUG_TRUE@ASSEMBLY = bin/Debug/GtkForm.exe
+ at ENABLE_RELEASE_TRUE@ASSEMBLY = bin/Release/GtkForm.exe
+ at ENABLE_DEBUG_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb
+ at ENABLE_RELEASE_TRUE@ASSEMBLY_MDB = 
+ at ENABLE_DEBUG_TRUE@COMPILE_TARGET = exe
+ at ENABLE_RELEASE_TRUE@COMPILE_TARGET = exe
+ at ENABLE_DEBUG_TRUE@PROJECT_REFERENCES = 
+ at ENABLE_RELEASE_TRUE@PROJECT_REFERENCES = 
+ at ENABLE_DEBUG_TRUE@BUILD_DIR = bin/Debug
+ at ENABLE_RELEASE_TRUE@BUILD_DIR = bin/Release
+ at ENABLE_DEBUG_TRUE@GTKFORM_EXE_MDB_SOURCE = bin/Debug/GtkForm.exe.mdb
+ at ENABLE_DEBUG_TRUE@GTKFORM_EXE_MDB = $(BUILD_DIR)/GtkForm.exe.mdb
+ at ENABLE_RELEASE_TRUE@GTKFORM_EXE_MDB = 
 AL = al2
-SATELLITE_ASSEMBLY_NAME = Mono.UIAutomation.Bridge.resources.dll
+SATELLITE_ASSEMBLY_NAME = .resources.dll
 PROGRAMFILES = \
-	$(UIAUTOMATIONBRIDGE_DLL_MDB)  
+	$(GTKFORM_EXE_MDB)  
 
 RESGEN = resgen2
 FILES = \
-	AssemblyInfo.cs \
-	../build/common/*.cs \
-	Mono.UIAutomation.Bridge/IAutomationBridge.cs \
-	Mono.UIAutomation.Bridge/IHypertext.cs \
-	Mono.UIAutomation.Services/Log.cs
+	GtkForm.cs
 
 DATA_FILES = 
 RESOURCES = 
+EXTRAS = 
 REFERENCES = \
-	WindowsBase \
 	System \
-	UIAutomationTypes
+	Mono.Posix \
+	System.Core \
+	$(GTK_SHARP_20_LIBS)
 
 DLL_REFERENCES = 
 CLEANFILES = $(PROGRAMFILES) $(ASSEMBLY) $(ASSEMBLY).mdb $(BINARIES) \
@@ -253,14 +279,14 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(a
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  UIAutomationBridge/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  UIAutomationBridge/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign UIAutomationClientTests/GtkForm/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign UIAutomationClientTests/GtkForm/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -278,44 +304,61 @@ $(top_srcdir)/configure:  $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-AssemblyInfo.cs: $(top_builddir)/config.status $(srcdir)/AssemblyInfo.cs.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+$(am__aclocal_m4_deps):
 install-binSCRIPTS: $(bin_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	    $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-binSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
 install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(linuxpkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)"
-	@list='$(linuxpkgconfig_DATA)'; for p in $$list; do \
+	@list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(linuxpkgconfigDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(linuxpkgconfigdir)/$$f'"; \
-	  $(linuxpkgconfigDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(linuxpkgconfigdir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(linuxpkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \
 	done
 
 uninstall-linuxpkgconfigDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(linuxpkgconfig_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(linuxpkgconfigdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(linuxpkgconfigdir)/$$f"; \
-	done
+	@list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(linuxpkgconfigdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(linuxpkgconfigdir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -339,13 +382,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -377,6 +424,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -396,26 +444,38 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
 
-install-data-am: install-data-local install-linuxpkgconfigDATA
+install-data-am: install-linuxpkgconfigDATA
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am: install-binSCRIPTS
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -434,31 +494,25 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA \
-	uninstall-local
+uninstall-am: uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA
 
 .MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic distclean \
 	distclean-generic distdir dvi dvi-am html html-am info info-am \
 	install install-am install-binSCRIPTS install-data \
-	install-data-am install-data-local install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-linuxpkgconfigDATA \
-	install-man install-pdf install-pdf-am install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
-	installdirs maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
-	uninstall-am uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA \
-	uninstall-local
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-linuxpkgconfigDATA install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
+	uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA
 
 
 all: $(ASSEMBLY) $(PROGRAMFILES)
 
-install-data-local: gac-install
-
-uninstall-local: gac-uninstall
-
 # macros
 
 # $(call emit-deploy-target,deploy-variable-name)
@@ -499,7 +553,7 @@ $(build_xamlg_list): %.xaml.g.cs: %.xaml
 $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list)
 	mkdir -p $(shell dirname $(ASSEMBLY))
 	$(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref)
-	sn -q -R $(ASSEMBLY) $(top_srcdir)/mono.snk
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/UIAutomationClientTests/Makefile.am b/UIAutomationClientTests/Makefile.am
new file mode 100644
index 0000000..e23dbb4
--- /dev/null
+++ b/UIAutomationClientTests/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = SampleForm UIAutomationClientTests GtkForm AtspiUiaClientTests
diff --git a/Makefile.in b/UIAutomationClientTests/Makefile.in
similarity index 60%
copy from Makefile.in
copy to UIAutomationClientTests/Makefile.in
index 895308b..2c9808b 100644
--- a/Makefile.in
+++ b/UIAutomationClientTests/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -15,8 +16,9 @@
 @SET_MAKE@
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -29,20 +31,16 @@ POST_INSTALL = :
 NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(top_srcdir)/build/common/Consts.cs.in \
-	$(top_srcdir)/configure COPYING ChangeLog NEWS install-sh \
-	missing mkinstalldirs
+subdir = UIAutomationClientTests
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/expansions.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_CLEAN_FILES = build/common/Consts.cs
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 SOURCES =
 DIST_SOURCES =
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -54,20 +52,38 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	ps-recursive uninstall-recursive
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
   distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
 ETAGS = etags
 CTAGS = ctags
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  { test ! -d $(distdir) \
-    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr $(distdir); }; }
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AUTOCONF = @AUTOCONF@
@@ -80,7 +96,11 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 GACUTIL = @GACUTIL@
+GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@
+GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@
 GMCS = @GMCS@
+GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@
+GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -110,6 +130,7 @@ SHELL = @SHELL@
 SN = @SN@
 STRIP = @STRIP@
 VERSION = @VERSION@
+WINDOWSBASE_LIBS = @WINDOWSBASE_LIBS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
@@ -152,50 +173,40 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-EXTRA_DIST = \
-	expansions.m4 \
-	mono.snk \
-	winfx3.pub
-
-SUBDIRS = WindowsBase UIAutomationTypes UIAutomationBridge UIAutomationProvider UIAutomationClient data
+SUBDIRS = SampleForm UIAutomationClientTests GtkForm AtspiUiaClientTests
 all: all-recursive
 
 .SUFFIXES:
-am--refresh:
-	@:
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
-	      cd $(srcdir) && $(AUTOMAKE) --foreign  \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign UIAutomationClientTests/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign UIAutomationClientTests/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
 	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
 $(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(srcdir) && $(AUTOCONF)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-build/common/Consts.cs: $(top_builddir)/config.status $(top_srcdir)/build/common/Consts.cs.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
 
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
@@ -221,7 +232,7 @@ $(RECURSIVE_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done; \
 	if test "$$dot_seen" = "no"; then \
@@ -255,16 +266,16 @@ $(RECURSIVE_CLEAN_TARGETS):
 	  else \
 	    local_target="$$target"; \
 	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
 	  || eval $$failcom; \
 	done && test -z "$$fail"
 tags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
 	done
 ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@@ -272,14 +283,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
 
 TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
+	set x; \
 	here=`pwd`; \
 	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
 	  include_option=--etags-include; \
@@ -291,7 +302,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
 	  fi; \
 	done; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
@@ -300,36 +311,39 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
 	fi
 ctags: CTAGS
 CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 		$(TAGS_FILES) $(LISP)
-	tags=; \
 	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	test -z "$(CTAGS_ARGS)$$unique" \
 	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
+	     $$unique
 
 GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
 
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
-	$(am__remove_distdir)
-	test -d $(distdir) || mkdir $(distdir)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
 	list='$(DISTFILES)'; \
@@ -345,136 +359,48 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d "$(distdir)/$$subdir" \
 	    || $(MKDIR_P) "$(distdir)/$$subdir" \
 	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
 	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
 		am__remove_distdir=: \
 		am__skip_length_check=: \
+		am__skip_mode_fix=: \
 	        distdir) \
 	      || exit 1; \
 	  fi; \
 	done
-	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r $(distdir)
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-lzma: distdir
-	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.lzma*) \
-	  unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && cd $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
-	@cd $(distuninstallcheck_dir) \
-	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
 check-am: all-am
 check: check-recursive
 all-am: Makefile
@@ -500,6 +426,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -509,7 +436,6 @@ clean: clean-recursive
 clean-am: clean-generic mostlyclean-am
 
 distclean: distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
 	-rm -f Makefile
 distclean-am: clean-am distclean-generic distclean-tags
 
@@ -519,6 +445,8 @@ dvi-am:
 
 html: html-recursive
 
+html-am:
+
 info: info-recursive
 
 info-am:
@@ -527,23 +455,31 @@ install-data-am:
 
 install-dvi: install-dvi-recursive
 
+install-dvi-am:
+
 install-exec-am:
 
 install-html: install-html-recursive
 
+install-html-am:
+
 install-info: install-info-recursive
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-recursive
 
+install-pdf-am:
+
 install-ps: install-ps-recursive
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -561,16 +497,14 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
-	install-strip
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am am--refresh check check-am clean clean-generic \
-	ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
-	dist-lzma dist-shar dist-tarZ dist-zip distcheck distclean \
-	distclean-generic distclean-tags distcleancheck distdir \
-	distuninstallcheck dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
+	all all-am check check-am clean clean-generic ctags \
+	ctags-recursive distclean distclean-generic distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-dvi \
 	install-dvi-am install-exec install-exec-am install-html \
 	install-html-am install-info install-info-am install-man \
 	install-pdf install-pdf-am install-ps install-ps-am \
@@ -579,6 +513,7 @@ uninstall-am:
 	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
 	tags-recursive uninstall uninstall-am
 
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/UIAutomationClientTests/SampleForm/Form1.Designer.cs b/UIAutomationClientTests/SampleForm/Form1.Designer.cs
new file mode 100644
index 0000000..8196c13
--- /dev/null
+++ b/UIAutomationClientTests/SampleForm/Form1.Designer.cs
@@ -0,0 +1,349 @@
+namespace SampleForm {
+	partial class Form1 {
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose (bool disposing)
+		{
+			if (disposing && ( components != null )) {
+				components.Dispose ();
+			}
+			base.Dispose (disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent ()
+		{
+			this.button1 = new System.Windows.Forms.Button ();
+			this.groupBox1 = new System.Windows.Forms.GroupBox ();
+			this.groupBox3 = new System.Windows.Forms.GroupBox ();
+			this.button7 = new System.Windows.Forms.Button ();
+			this.button6 = new System.Windows.Forms.Button ();
+			this.groupBox2 = new System.Windows.Forms.GroupBox ();
+			this.button5 = new System.Windows.Forms.Button ();
+			this.checkBox1 = new System.Windows.Forms.CheckBox ();
+			this.button4 = new System.Windows.Forms.Button ();
+			this.button3 = new System.Windows.Forms.Button ();
+			this.button2 = new System.Windows.Forms.Button ();
+			this.panel1 = new System.Windows.Forms.Panel ();
+			this.btnRemoveTextbox = new System.Windows.Forms.Button ();
+			this.btnAddTextbox = new System.Windows.Forms.Button ();
+			this.label1 = new System.Windows.Forms.Label ();
+			this.textBox1 = new System.Windows.Forms.TextBox ();
+			this.textBox2 = new System.Windows.Forms.TextBox ();
+			this.textBox3 = new System.Windows.Forms.TextBox ();
+			this.treeView1 = new System.Windows.Forms.TreeView ();
+			this.txtCommand = new System.Windows.Forms.TextBox();
+            this.btnRun = new System.Windows.Forms.Button();
+			this.numericUpDown1 = new System.Windows.Forms.NumericUpDown ();
+			this.groupBox1.SuspendLayout ();
+			this.groupBox3.SuspendLayout ();
+			this.groupBox2.SuspendLayout ();
+			this.panel1.SuspendLayout ();
+			this.dataGridView1 = new System.Windows.Forms.DataGridView();
+			( (System.ComponentModel.ISupportInitialize) (this.dataGridView1 ) ).BeginInit ();
+			( (System.ComponentModel.ISupportInitialize) ( this.numericUpDown1 ) ).BeginInit ();
+			this.listView1 = new System.Windows.Forms.ListView();
+			this.SuspendLayout ();
+			// 
+			// button1
+			// 
+			this.button1.Location = new System.Drawing.Point (102, 26);
+			this.button1.Name = "button1";
+			this.button1.Size = new System.Drawing.Size (75, 23);
+			this.button1.TabIndex = 0;
+			this.button1.Text = "b&utton1";
+			this.button1.UseVisualStyleBackColor = true;
+			this.button1.Click += new System.EventHandler (this.button1_Click);
+			// 
+			// groupBox1
+			// 
+			this.groupBox1.Controls.Add (this.groupBox3);
+			this.groupBox1.Controls.Add (this.groupBox2);
+			this.groupBox1.Controls.Add (this.button3);
+			this.groupBox1.Controls.Add (this.button2);
+			this.groupBox1.Location = new System.Drawing.Point (44, 153);
+			this.groupBox1.Name = "groupBox1";
+			this.groupBox1.Size = new System.Drawing.Size (489, 204);
+			this.groupBox1.TabIndex = 1;
+			this.groupBox1.TabStop = false;
+			this.groupBox1.Text = "groupBox1";
+			// 
+			// groupBox3
+			// 
+			this.groupBox3.Controls.Add (this.button7);
+			this.groupBox3.Controls.Add (this.button6);
+			this.groupBox3.Enabled = false;
+			this.groupBox3.Location = new System.Drawing.Point (272, 20);
+			this.groupBox3.Name = "groupBox3";
+			this.groupBox3.Size = new System.Drawing.Size (200, 100);
+			this.groupBox3.TabIndex = 3;
+			this.groupBox3.TabStop = false;
+			this.groupBox3.Text = "groupBox3";
+			// 
+			// button7
+			// 
+			this.button7.Enabled = false;
+			this.button7.Location = new System.Drawing.Point (7, 44);
+			this.button7.Name = "button7";
+			this.button7.Size = new System.Drawing.Size (75, 23);
+			this.button7.TabIndex = 1;
+			this.button7.Text = "button7";
+			this.button7.UseVisualStyleBackColor = true;
+			// 
+			// button6
+			// 
+			this.button6.Location = new System.Drawing.Point (7, 13);
+			this.button6.Name = "button6";
+			this.button6.Size = new System.Drawing.Size (75, 23);
+			this.button6.TabIndex = 0;
+			this.button6.Text = "button6";
+			this.button6.UseVisualStyleBackColor = true;
+			// 
+			// groupBox2
+			// 
+			this.groupBox2.Controls.Add (this.button5);
+			this.groupBox2.Controls.Add (this.checkBox1);
+			this.groupBox2.Controls.Add (this.button4);
+			this.groupBox2.Location = new System.Drawing.Point (66, 93);
+			this.groupBox2.Name = "groupBox2";
+			this.groupBox2.Size = new System.Drawing.Size (200, 100);
+			this.groupBox2.TabIndex = 2;
+			this.groupBox2.TabStop = false;
+			this.groupBox2.Text = "groupBox2";
+			// 
+			// button5
+			// 
+			this.button5.Enabled = false;
+			this.button5.Location = new System.Drawing.Point (90, 20);
+			this.button5.Name = "button5";
+			this.button5.Size = new System.Drawing.Size (75, 23);
+			this.button5.TabIndex = 2;
+			this.button5.Text = "button5";
+			this.button5.UseVisualStyleBackColor = true;
+			// 
+			// checkBox1
+			// 
+			this.checkBox1.AutoSize = true;
+			this.checkBox1.Location = new System.Drawing.Point (7, 50);
+			this.checkBox1.Name = "checkBox1";
+			this.checkBox1.Size = new System.Drawing.Size (80, 17);
+			this.checkBox1.TabIndex = 1;
+			this.checkBox1.Text = "checkBox1";
+			this.checkBox1.UseVisualStyleBackColor = true;
+			// 
+			// button4
+			// 
+			this.button4.Location = new System.Drawing.Point (7, 20);
+			this.button4.Name = "button4";
+			this.button4.Size = new System.Drawing.Size (75, 23);
+			this.button4.TabIndex = 0;
+			this.button4.Text = "button4";
+			this.button4.UseVisualStyleBackColor = true;
+			// 
+			// button3
+			// 
+			this.button3.AccessibleDescription = "help text 3";
+			this.button3.Enabled = false;
+			this.button3.Location = new System.Drawing.Point (66, 63);
+			this.button3.Name = "button3";
+			this.button3.Size = new System.Drawing.Size (75, 23);
+			this.button3.TabIndex = 1;
+			this.button3.Text = "button3";
+			this.button3.UseVisualStyleBackColor = true;
+			// 
+			// button2
+			// 
+			this.button2.Location = new System.Drawing.Point (66, 33);
+			this.button2.Name = "button2";
+			this.button2.Size = new System.Drawing.Size (128, 23);
+			this.button2.TabIndex = 0;
+			this.button2.Text = "button2";
+			this.button2.UseVisualStyleBackColor = true;
+			// 
+			// panel1
+			// 
+			this.panel1.Controls.Add (this.btnRemoveTextbox);
+			this.panel1.Controls.Add (this.btnAddTextbox);
+			this.panel1.Location = new System.Drawing.Point (338, 26);
+			this.panel1.Name = "panel1";
+			this.panel1.Size = new System.Drawing.Size (130, 130);
+			this.panel1.TabIndex = 4;
+			// 
+			// btnRemoveTextbox
+			// 
+			this.btnRemoveTextbox.Location = new System.Drawing.Point (62, 9);
+			this.btnRemoveTextbox.Name = "btnRemoveTextbox";
+			this.btnRemoveTextbox.Size = new System.Drawing.Size (63, 25);
+			this.btnRemoveTextbox.TabIndex = 1;
+			this.btnRemoveTextbox.Text = "Remove";
+			this.btnRemoveTextbox.UseVisualStyleBackColor = true;
+			this.btnRemoveTextbox.Click += new System.EventHandler (this.btnRemoveTextbox_Click);
+			// 
+			// btnAddTextbox
+			// 
+			this.btnAddTextbox.Location = new System.Drawing.Point (6, 9);
+			this.btnAddTextbox.Name = "btnAddTextbox";
+			this.btnAddTextbox.Size = new System.Drawing.Size (50, 25);
+			this.btnAddTextbox.TabIndex = 0;
+			this.btnAddTextbox.Text = "Add";
+			this.btnAddTextbox.UseVisualStyleBackColor = true;
+			this.btnAddTextbox.Click += new System.EventHandler (this.btnAddTextbox_Click);
+			// 
+			// label1
+			// 
+			this.label1.AutoSize = true;
+			this.label1.Location = new System.Drawing.Point (61, 31);
+			this.label1.Name = "label1";
+			this.label1.Size = new System.Drawing.Size (35, 13);
+			this.label1.TabIndex = 2;
+			this.label1.Text = "label1";
+			// 
+			// textBox1
+			// 
+			this.textBox1.Location = new System.Drawing.Point (102, 56);
+			this.textBox1.Name = "textBox1";
+			this.textBox1.Size = new System.Drawing.Size (100, 20);
+			this.textBox1.TabIndex = 3;
+			// 
+			// textBox2
+			// 
+			this.textBox2.Enabled = false;
+			this.textBox2.Location = new System.Drawing.Point (102, 83);
+			this.textBox2.Name = "textBox2";
+			this.textBox2.ReadOnly = true;
+			this.textBox2.Size = new System.Drawing.Size (100, 20);
+			this.textBox2.TabIndex = 4;
+			this.textBox2.UseSystemPasswordChar = true;
+			// 
+			// textBox3
+			// 
+			this.textBox3.Location = new System.Drawing.Point (232, 26);
+			this.textBox3.Multiline = true;
+			this.textBox3.Name = "textBox3";
+			this.textBox3.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+			this.textBox3.Size = new System.Drawing.Size (100, 90);
+			this.textBox3.TabIndex = 7;
+			this.textBox3.Text = "abcdefgabcdefgabcdef\n\n\n\n\n\n\n\ngabcdefgabcdefg";
+			this.textBox3.WordWrap = false;
+			// 
+			// treeView1
+			// 
+			this.treeView1.Location = new System.Drawing.Point (44, 364);
+			this.treeView1.Name = "treeView1";
+			this.treeView1.Size = new System.Drawing.Size (121, 97);
+			this.treeView1.TabIndex = 8;
+			// 
+			// txtCommand
+			// 
+			this.txtCommand.Location = new System.Drawing.Point(44, 432);
+			this.txtCommand.Name = "txtCommand";
+			this.txtCommand.Size = new System.Drawing.Size(120, 21);
+			this.txtCommand.TabIndex = 9;
+			this.txtCommand.Text = "command";
+			// 
+			// btnRun
+			// 
+			this.btnRun.Location = new System.Drawing.Point(170, 432);
+			this.btnRun.Name = "btnRun";
+			this.btnRun.Size = new System.Drawing.Size(45, 23);
+			this.btnRun.TabIndex = 10;
+			this.btnRun.Text = "Run";
+			this.btnRun.UseVisualStyleBackColor = true;
+			this.btnRun.Click += new System.EventHandler (this.btnRun_Click);
+			// 
+			// numericUpDown1
+			// 
+			this.numericUpDown1.Location = new System.Drawing.Point (102, 110);
+			this.numericUpDown1.Name = "numericUpDown1";
+			this.numericUpDown1.Size = new System.Drawing.Size (120, 20);
+			this.numericUpDown1.TabIndex = 11;
+			// 
+			// dataGridView1
+			// 
+			this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+			this.dataGridView1.Location = new System.Drawing.Point (200, 364);
+			this.dataGridView1.Name = "dataGridView1";
+			this.dataGridView1.Size = new System.Drawing.Size (240, 150);
+			this.dataGridView1.TabIndex = 12;
+			//
+			// listView1
+			// 
+			this.listView1.Location = new System.Drawing.Point(450, 364);
+			this.listView1.Name = "listView1";
+			this.listView1.Size = new System.Drawing.Size(150, 150);
+			this.listView1.TabIndex = 13;
+			this.listView1.UseCompatibleStateImageBehavior = false;
+			// 
+			// Form1
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF (6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.ClientSize = new System.Drawing.Size (587, 530);
+			this.Controls.Add(this.btnRun);
+			this.Controls.Add(this.txtCommand);
+			this.Controls.Add (this.numericUpDown1);
+			this.Controls.Add (this.treeView1);
+			this.Controls.Add (this.panel1);
+			this.Controls.Add (this.textBox3);
+			this.Controls.Add (this.textBox2);
+			this.Controls.Add (this.textBox1);
+			this.Controls.Add (this.label1);
+			this.Controls.Add (this.groupBox1);
+			this.Controls.Add (this.button1);
+			this.Controls.Add (this.dataGridView1);
+			this.Controls.Add (this.listView1);
+			this.Name = "Form1";
+			this.Text = "TestForm1";
+			this.groupBox1.ResumeLayout (false);
+			this.groupBox3.ResumeLayout (false);
+			this.groupBox2.ResumeLayout (false);
+			this.groupBox2.PerformLayout ();
+			this.panel1.ResumeLayout (false);
+			( (System.ComponentModel.ISupportInitialize) ( this.numericUpDown1 ) ).EndInit ();
+			( (System.ComponentModel.ISupportInitialize) ( this.dataGridView1 ) ).EndInit ();
+			this.ResumeLayout (false);
+			this.PerformLayout ();
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.Button button1;
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.Button button3;
+		private System.Windows.Forms.Button button2;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.TextBox textBox1;
+		private System.Windows.Forms.TextBox textBox2;
+		private System.Windows.Forms.TextBox textBox3;
+		private System.Windows.Forms.GroupBox groupBox2;
+		private System.Windows.Forms.Button button5;
+		private System.Windows.Forms.CheckBox checkBox1;
+		private System.Windows.Forms.Button button4;
+		private System.Windows.Forms.GroupBox groupBox3;
+		private System.Windows.Forms.Button button7;
+		private System.Windows.Forms.Button button6;
+		private System.Windows.Forms.Panel panel1;
+		private System.Windows.Forms.Button btnRemoveTextbox;
+		private System.Windows.Forms.Button btnAddTextbox;
+		private System.Windows.Forms.TreeView treeView1;
+		private System.Windows.Forms.TextBox txtCommand;
+		private System.Windows.Forms.Button btnRun;
+		private System.Windows.Forms.NumericUpDown numericUpDown1;
+		private System.Windows.Forms.DataGridView dataGridView1;
+		private System.Windows.Forms.ListView listView1;
+	}
+}
+
diff --git a/UIAutomationClientTests/SampleForm/Form1.cs b/UIAutomationClientTests/SampleForm/Form1.cs
new file mode 100644
index 0000000..d25a089
--- /dev/null
+++ b/UIAutomationClientTests/SampleForm/Form1.cs
@@ -0,0 +1,276 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+// 
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace SampleForm {
+	public partial class Form1 : Form {
+
+		private DataTable table = new DataTable ();
+		private Form childForm;
+		private MenuStrip menuStrip1 = new MenuStrip ();
+
+		private int button1ClickCount = 0;
+
+		public Form1 ()
+		{
+			InitializeComponent ();
+			txtCommand.AccessibleName = "txtCommand";
+			textBox3.AccessibleName = "textBox3";
+
+			this.button4.Click += new System.EventHandler (this.button4_Click);
+
+			TreeNode node = new TreeNode ("item 1");
+			node.Nodes.Add (new TreeNode ("item 1a"));
+			treeView1.Nodes.Add (node);
+			node = new TreeNode ("item 2");
+			node.Nodes.Add (new TreeNode ("item 2a"));
+			node.Nodes.Add (new TreeNode ("item 2b"));
+			treeView1.Nodes.Add (node);
+
+			table.Columns.Add ("Gender", typeof (bool));
+			table.Columns.Add ("Name", typeof (string));
+			table.Columns.Add ("Age", typeof (uint));
+			DataRow tableRow;
+			tableRow = table.NewRow ();
+			tableRow [0] = false;
+			tableRow [1] = "Alice";
+			tableRow [2] = 24;
+			table.Rows.Add (tableRow);
+			tableRow = table.NewRow ();
+			tableRow [0] = true;
+			tableRow [1] = "Bob";
+			tableRow [2] = 28;
+			table.Rows.Add (tableRow);
+
+			dataGridView1.DataSource = table;
+			dataGridView1.AccessibleName = "dataGridView1";
+
+			listView1.AccessibleName = "listView1";
+			var view = listView1;
+			view.CheckBoxes = true;
+			view.View = View.Details;
+			view.Columns.Add ("Subcolumn 1", 100, HorizontalAlignment.Left);
+			view.Columns.Add ("Subcolumn 2", 100, HorizontalAlignment.Center);
+			for (int i = 0; i < 10; i++) {
+				ListViewItem item = new ListViewItem ();
+				item.Text = "Item " + i;
+				item.SubItems.Add ("subitem1");
+				item.SubItems.Add ("subitem2");
+				view.Items.Add (item);
+			}
+
+			MyControl myCtrl = new MyControl ();
+			myCtrl.AccessibleName = "My Control";
+			myCtrl.Bounds = new Rectangle (5, 5, 30, 15);
+			Controls.Add (myCtrl);
+
+			menuStrip1.AccessibleName = "menuStrip1";
+			menuStrip1.Dock = DockStyle.Top;
+			var file = new ToolStripMenuItem ("&File");
+			file.DropDownItems.Add (new ToolStripMenuItem ("&New"));
+			file.DropDownItems.Add (new ToolStripMenuItem ("&Open"));
+			var edit = new ToolStripMenuItem ("&Edit");
+			edit.DropDownItems.Add (new ToolStripMenuItem ("&Undo"));
+			edit.DropDownItems.Add (new ToolStripSeparator ());
+			edit.DropDownItems.Add (new ToolStripMenuItem ("&Cut"));
+			edit.DropDownItems.Add (new ToolStripMenuItem ("&Copy"));
+			edit.DropDownItems.Add (new ToolStripMenuItem ("&Paste"));
+			menuStrip1.Items.Add (file);
+			menuStrip1.Items.Add (edit);
+			Controls.Add (menuStrip1);
+		}
+
+		private void button1_Click (object sender, EventArgs e)
+		{
+			button1ClickCount++;
+			if (button1ClickCount == 1) {
+				textBox1.Text = "button1_click";
+				label1.Text = "button1_click";
+			} else {
+				textBox1.Text = "button1_click" + button1ClickCount;
+				label1.Text = "button1_click" + button1ClickCount;
+			}
+			Console.WriteLine ("textbox1 & label1's texts are modified.");
+		}
+
+		private void button4_Click (object sender, EventArgs e)
+		{
+			numericUpDown1.Enabled = !numericUpDown1.Enabled;
+			treeView1.Enabled = !treeView1.Enabled;
+			menuStrip1.Enabled = !menuStrip1.Enabled;
+		}
+
+		private void btnAddTextbox_Click (object sender, EventArgs e)
+		{
+			TextBox box = new TextBox();
+			box.Width = 30;
+			box.Left = 10;
+			box.Top = panel1.Controls.Count * 25;
+			panel1.Controls.Add(box);
+		}
+
+		private void btnRemoveTextbox_Click (object sender, EventArgs e)
+		{
+			if (panel1.Controls.Count <= 2)
+				throw new Exception ("No more child control to delete");
+			Control controlToDelete = null;
+			foreach (Control c in panel1.Controls)
+			{
+				if (controlToDelete == null || controlToDelete.Top < c.Top)
+					controlToDelete = c;
+			}
+			if (controlToDelete != null) {
+				panel1.Controls.Remove (controlToDelete);
+				controlToDelete.Dispose ();
+			}
+		}
+
+		private void btnRun_Click (object sender, EventArgs e)
+		{
+			const string sampleText = "Lorem ipsum dolor sit amet";
+
+			string cmd = txtCommand.Text;
+			if (cmd == "click button1")
+				button1.PerformClick ();
+			else if (cmd == "set textbox3 text")
+				textBox3.Text = sampleText;
+			else if (cmd.StartsWith ("set textbox3 to ")) {
+				textBox3.Text = cmd.Substring (16).Replace (":", "\n");
+			}else if (cmd == "select textbox3") {
+				if (textBox3.Text.Length < 4)
+					textBox3.Text = sampleText;
+				if (textBox3.SelectionLength == 3)
+					textBox3.Select (0, 4);
+				else
+					textBox3.Select (0, 3);
+			} else if (cmd == "MoveTo.Origin") {
+				Location = new Point (0, 0);
+			} else if (cmd == "Toggle.Transform.CanMove") {
+				if (WindowState == FormWindowState.Normal)
+					WindowState = FormWindowState.Maximized;
+				else
+					WindowState = FormWindowState.Normal;
+			} else if (cmd == "Toggle.Transform.CanResize") {
+				if (FormBorderStyle == FormBorderStyle.Sizable)
+					FormBorderStyle = FormBorderStyle.FixedSingle;
+				else
+					FormBorderStyle = FormBorderStyle.Sizable;
+			} else if (cmd == "add table row")
+				table.Rows.Add (true, "Mallory", 40);
+			else if (cmd == "add table column")
+				table.Columns.Add("More");
+			else if (cmd == "set textBox3 long text")
+				textBox3.Text = "very very very very very very very very long text to enable the horizontal scroll bar";
+			else if (cmd == "disable textBox3")
+				textBox3.Enabled = false;
+			else if (cmd == "disable checkBox1")
+				checkBox1.Enabled = false;
+			else if (cmd == "enable checkBox1")
+				checkBox1.Enabled = true;
+			else if (cmd == "change list view mode list")
+				listView1.View = View.List;
+			else if (cmd == "change list view mode tile")
+				listView1.View = View.Tile;
+			else if (cmd == "change list view mode details")
+				listView1.View = View.Details;
+			else if (cmd == "disable list view")
+				listView1.Enabled = false;
+			else if (cmd == "enable list view")
+				listView1.Enabled = true;
+			else if (cmd == "make listView1 higher")
+				listView1.Height = 500;
+			else if (cmd == "add listView1 item") {
+				ListViewItem item = new ListViewItem ();
+				item.Text = "Item Extra";
+				item.SubItems.Add ("subitem1");
+				item.SubItems.Add ("subitem2");
+				listView1.Items.Add (item);
+			} else if (cmd == "Open.ChildWindow") {
+				if (childForm == null) {
+					childForm = new Form ();
+					childForm.Text = "TestForm1.ChildForm1";
+				}
+				childForm.Show ();
+			} else if (cmd == "Close.ChildWindow") {
+				if (childForm != null) {
+					childForm.Close ();
+					childForm = null;
+				}
+			} else if (cmd == "Toggle.Window.CanMaximize") {
+				MaximizeBox = !MaximizeBox;
+			} else if (cmd == "Toggle.Window.CanMinimize") {
+				MinimizeBox = !MinimizeBox;
+			} else if (cmd == "Toggle.Window.IsTopmost") {
+				TopMost = !TopMost;
+			} else if (cmd == "Open.ModalChildWindow") {
+				new Form () {Text = "TestForm1.ModalForm1"}.ShowDialog (this);
+			} else if (cmd == "Sleep.2000") {
+				System.Threading.Thread.Sleep (2000);
+			} else if (cmd == "enable multiselect")
+				listView1.MultiSelect = true;
+			else if (cmd == "disable multiselect")
+				listView1.MultiSelect = false;
+			else if (cmd == "change button3 name") {
+				button3.AccessibleName = "xyzzy";
+			} else if (cmd == "change button3 helptext") {
+				button3.AccessibleDescription = "plugh";
+			} else if (cmd == "enable button3") {
+				button3.Enabled = true;
+			} else if (cmd == "disable button3") {
+				button3.Enabled = false;
+			} else if (cmd == "focus textBox3")
+				textBox3.Focus ();
+			else if (cmd == "focus button2")
+				button2.Focus ();
+			else if (cmd.StartsWith ("change title:"))
+				this.Text = cmd.Substring (cmd.IndexOf (':') + 1);
+			else if (cmd == "change form size 800x600")
+				this.Size = new Size (800, 600);
+			else if (cmd == "textBox3 singleline")
+				textBox3.Multiline = false;
+			else if (cmd == "bring form to front")
+				this.BringToFront ();
+			else if (cmd == "hide form for 3 seconds") {
+				this.Hide ();
+				var thread = new System.Threading.Thread (() => {
+					System.Threading.Thread.Sleep (3000);
+					MethodInvoker invoker = () => this.Show ();
+					this.Invoke (invoker);
+				});
+				thread.Start ();
+			} else if (cmd == "toggle form border")
+				FormBorderStyle = (FormBorderStyle == FormBorderStyle.None) ?
+					FormBorderStyle.Sizable : FormBorderStyle.None;
+		}
+	}
+}
diff --git a/UIAutomationClientTests/SampleForm/Form1.resx b/UIAutomationClientTests/SampleForm/Form1.resx
new file mode 100644
index 0000000..19dc0dd
--- /dev/null
+++ b/UIAutomationClientTests/SampleForm/Form1.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/UIAutomationClientTests/SampleForm/Makefile.am b/UIAutomationClientTests/SampleForm/Makefile.am
new file mode 100644
index 0000000..69b7af0
--- /dev/null
+++ b/UIAutomationClientTests/SampleForm/Makefile.am
@@ -0,0 +1,64 @@
+
+EXTRA_DIST =  
+
+ASSEMBLY_COMPILER_COMMAND = gmcs
+ASSEMBLY_COMPILER_FLAGS =  -noconfig -codepage:utf8 -warn:4 -optimize- -debug "-define:DEBUG;TRACE"
+ASSEMBLY = bin/Debug/SampleForm.exe
+ASSEMBLY_MDB = $(ASSEMBLY).mdb
+COMPILE_TARGET = winexe
+PROJECT_REFERENCES = 
+BUILD_DIR = bin/Debug/
+
+SAMPLEFORM_EXE_MDB_SOURCE=bin/Debug/SampleForm.exe.mdb
+SAMPLEFORM_EXE_MDB=$(BUILD_DIR)/SampleForm.exe.mdb
+
+AL=al2
+SATELLITE_ASSEMBLY_NAME=$(notdir $(basename $(ASSEMBLY))).resources.dll
+
+PROGRAMFILES = \
+	$(SAMPLEFORM_EXE_MDB)  
+
+BINARIES =  
+
+
+RESGEN=resgen2
+	
+all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) 
+
+FILES =  \
+	Form1.cs \
+	Form1.Designer.cs \
+	MyControl.cs \
+	Program.cs \
+	Properties/AssemblyInfo.cs
+
+DATA_FILES = 
+
+RESOURCES = Form1.resx,SampleForm.Form1.resources
+
+EXTRAS = 
+
+REFERENCES =  \
+	System \
+	System.Core \
+	System.Xml.Linq \
+	System.Data.DataSetExtensions \
+	System.Data \
+	System.Drawing \
+	System.Windows.Forms \
+	System.Xml
+
+DLL_REFERENCES = 
+
+CLEANFILES = $(PROGRAMFILES) $(BINARIES) 
+
+include $(top_srcdir)/Makefile.include
+
+
+$(eval $(call emit_resgen_targets))
+$(build_xamlg_list): %.xaml.g.cs: %.xaml
+	xamlg '$<'
+
+$(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list)
+	mkdir -p $(shell dirname $(ASSEMBLY))
+	$(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref)
diff --git a/UIAutomationBridge/Makefile.in b/UIAutomationClientTests/SampleForm/Makefile.in
similarity index 73%
copy from UIAutomationBridge/Makefile.in
copy to UIAutomationClientTests/SampleForm/Makefile.in
index 85e1266..5a91710 100644
--- a/UIAutomationBridge/Makefile.in
+++ b/UIAutomationClientTests/SampleForm/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.11 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -17,8 +18,9 @@
 
 VPATH = @srcdir@
 pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
 am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 install_sh_DATA = $(install_sh) -c -m 644
 install_sh_PROGRAM = $(install_sh) -c
@@ -31,29 +33,43 @@ POST_INSTALL = :
 NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
-DIST_COMMON = $(srcdir)/AssemblyInfo.cs.in $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(top_srcdir)/Makefile.include ChangeLog
-subdir = UIAutomationBridge
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Makefile.include
+subdir = UIAutomationClientTests/SampleForm
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/expansions.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_CLEAN_FILES = AssemblyInfo.cs
-am__installdirs = "$(DESTDIR)$(bindir)" \
-	"$(DESTDIR)$(linuxpkgconfigdir)"
-binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-SCRIPTS = $(bin_SCRIPTS)
-SOURCES =
-DIST_SOURCES =
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     *) f=$$p;; \
   esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-linuxpkgconfigDATA_INSTALL = $(INSTALL_DATA)
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(linuxpkgconfigdir)"
+SCRIPTS = $(bin_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
 DATA = $(linuxpkgconfig_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -68,7 +84,11 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 GACUTIL = @GACUTIL@
+GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@
+GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@
 GMCS = @GMCS@
+GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@
+GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -98,6 +118,7 @@ SHELL = @SHELL@
 SN = @SN@
 STRIP = @STRIP@
 VERSION = @VERSION@
+WINDOWSBASE_LIBS = @WINDOWSBASE_LIBS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
@@ -144,38 +165,45 @@ EXTRA_DIST = $(build_sources) $(build_resx_files) \
 	$(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \
 	$(DATA_FILES) $(build_culture_res_files)
 ASSEMBLY_COMPILER_COMMAND = gmcs
-ASSEMBLY_COMPILER_FLAGS = -lib:@expanded_libdir@/mono/2.0 -lib:../bin -lib:@expanded_libdir@/mono/accessibility -noconfig -codepage:utf8 -warn:4 -warnaserror -optimize+ -debug "-define:DEBUG" -d:NET_2_0
-ASSEMBLY = ../bin/UIAutomationBridge.dll
+ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize- -debug "-define:DEBUG;TRACE"
+ASSEMBLY = bin/Debug/SampleForm.exe
 ASSEMBLY_MDB = $(ASSEMBLY).mdb
-COMPILE_TARGET = library
+COMPILE_TARGET = winexe
 PROJECT_REFERENCES = 
-BUILD_DIR = ../bin
-PACKAGE_FLAG = /package accessibility
-UIAUTOMATIONBRIDGE_DLL_MDB_SOURCE = ../bin/UIAutomationBridge.dll.mdb
-UIAUTOMATIONBRIDGE_DLL_MDB = $(BUILD_DIR)/UIAutomationBridge.dll.mdb
+BUILD_DIR = bin/Debug/
+SAMPLEFORM_EXE_MDB_SOURCE = bin/Debug/SampleForm.exe.mdb
+SAMPLEFORM_EXE_MDB = $(BUILD_DIR)/SampleForm.exe.mdb
 AL = al2
-SATELLITE_ASSEMBLY_NAME = Mono.UIAutomation.Bridge.resources.dll
+SATELLITE_ASSEMBLY_NAME = $(notdir $(basename $(ASSEMBLY))).resources.dll
 PROGRAMFILES = \
-	$(UIAUTOMATIONBRIDGE_DLL_MDB)  
+	$(SAMPLEFORM_EXE_MDB)  
 
+BINARIES = 
 RESGEN = resgen2
 FILES = \
-	AssemblyInfo.cs \
-	../build/common/*.cs \
-	Mono.UIAutomation.Bridge/IAutomationBridge.cs \
-	Mono.UIAutomation.Bridge/IHypertext.cs \
-	Mono.UIAutomation.Services/Log.cs
+	Form1.cs \
+	Form1.Designer.cs \
+	MyControl.cs \
+	Program.cs \
+	Properties/AssemblyInfo.cs
 
 DATA_FILES = 
-RESOURCES = 
+RESOURCES = Form1.resx,SampleForm.Form1.resources
+EXTRAS = 
 REFERENCES = \
-	WindowsBase \
 	System \
-	UIAutomationTypes
+	System.Core \
+	System.Xml.Linq \
+	System.Data.DataSetExtensions \
+	System.Data \
+	System.Drawing \
+	System.Windows.Forms \
+	System.Xml
 
 DLL_REFERENCES = 
-CLEANFILES = $(PROGRAMFILES) $(ASSEMBLY) $(ASSEMBLY).mdb $(BINARIES) \
-	$(build_resx_resources) $(build_satellite_assembly_list)
+CLEANFILES = $(PROGRAMFILES) $(BINARIES) $(ASSEMBLY) $(ASSEMBLY).mdb \
+	$(BINARIES) $(build_resx_resources) \
+	$(build_satellite_assembly_list)
 VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT
 s2q = $(subst \ ,?,$1)
 q2s = $(subst ?,\ ,$1)
@@ -253,14 +281,14 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(a
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  UIAutomationBridge/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  UIAutomationBridge/Makefile
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign UIAutomationClientTests/SampleForm/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign UIAutomationClientTests/SampleForm/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -278,44 +306,61 @@ $(top_srcdir)/configure:  $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-AssemblyInfo.cs: $(top_builddir)/config.status $(srcdir)/AssemblyInfo.cs.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+$(am__aclocal_m4_deps):
 install-binSCRIPTS: $(bin_SCRIPTS)
 	@$(NORMAL_INSTALL)
 	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f $$d$$p; then \
-	    f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	    echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	    $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
-	  else :; fi; \
-	done
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
 
 uninstall-binSCRIPTS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
 install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(linuxpkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)"
-	@list='$(linuxpkgconfig_DATA)'; for p in $$list; do \
+	@list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \
+	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(linuxpkgconfigDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(linuxpkgconfigdir)/$$f'"; \
-	  $(linuxpkgconfigDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(linuxpkgconfigdir)/$$f"; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(linuxpkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \
 	done
 
 uninstall-linuxpkgconfigDATA:
 	@$(NORMAL_UNINSTALL)
-	@list='$(linuxpkgconfig_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(linuxpkgconfigdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(linuxpkgconfigdir)/$$f"; \
-	done
+	@list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(linuxpkgconfigdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(linuxpkgconfigdir)" && rm -f $$files
 tags: TAGS
 TAGS:
 
@@ -339,13 +384,17 @@ distdir: $(DISTFILES)
 	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 	  if test -d $$d/$$file; then \
 	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
 	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
 	    || exit 1; \
 	  fi; \
 	done
@@ -377,6 +426,7 @@ clean-generic:
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
@@ -396,26 +446,38 @@ dvi-am:
 
 html: html-am
 
+html-am:
+
 info: info-am
 
 info-am:
 
-install-data-am: install-data-local install-linuxpkgconfigDATA
+install-data-am: install-linuxpkgconfigDATA
 
 install-dvi: install-dvi-am
 
+install-dvi-am:
+
 install-exec-am: install-binSCRIPTS
 
 install-html: install-html-am
 
+install-html-am:
+
 install-info: install-info-am
 
+install-info-am:
+
 install-man:
 
 install-pdf: install-pdf-am
 
+install-pdf-am:
+
 install-ps: install-ps-am
 
+install-ps-am:
+
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
@@ -434,30 +496,24 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA \
-	uninstall-local
+uninstall-am: uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA
 
 .MAKE: install-am install-strip
 
 .PHONY: all all-am check check-am clean clean-generic distclean \
 	distclean-generic distdir dvi dvi-am html html-am info info-am \
 	install install-am install-binSCRIPTS install-data \
-	install-data-am install-data-local install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-linuxpkgconfigDATA \
-	install-man install-pdf install-pdf-am install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
-	installdirs maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
-	uninstall-am uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA \
-	uninstall-local
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-linuxpkgconfigDATA install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
+	uninstall-binSCRIPTS uninstall-linuxpkgconfigDATA
 
 
-all: $(ASSEMBLY) $(PROGRAMFILES)
-
-install-data-local: gac-install
-
-uninstall-local: gac-uninstall
+all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) 
 
 # macros
 
@@ -499,7 +555,7 @@ $(build_xamlg_list): %.xaml.g.cs: %.xaml
 $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list)
 	mkdir -p $(shell dirname $(ASSEMBLY))
 	$(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref)
-	sn -q -R $(ASSEMBLY) $(top_srcdir)/mono.snk
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/UIAutomationClientTests/SampleForm/MyControl.cs b/UIAutomationClientTests/SampleForm/MyControl.cs
new file mode 100644
index 0000000..4061e53
--- /dev/null
+++ b/UIAutomationClientTests/SampleForm/MyControl.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace SampleForm
+{
+	public class MyControl : Control
+	{
+		public MyControl ()
+		{
+			this.BackColor = Color.Green;
+		}
+	}
+}
+
diff --git a/UIAutomationClientTests/SampleForm/Program.cs b/UIAutomationClientTests/SampleForm/Program.cs
new file mode 100644
index 0000000..0742729
--- /dev/null
+++ b/UIAutomationClientTests/SampleForm/Program.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace SampleForm {
+	static class Program {
+		/// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		static void Main ()
+		{
+			Application.EnableVisualStyles ();
+			Application.SetCompatibleTextRenderingDefault (false);
+			Application.Run (new Form1 ());
+		}
+	}
+}
diff --git a/UIAutomationClientTests/SampleForm/Properties/AssemblyInfo.cs b/UIAutomationClientTests/SampleForm/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..7b7fee2
--- /dev/null
+++ b/UIAutomationClientTests/SampleForm/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle ("SampleForm")]
+[assembly: AssemblyDescription ("")]
+[assembly: AssemblyConfiguration ("")]
+[assembly: AssemblyCompany ("")]
+[assembly: AssemblyProduct ("SampleForm")]
+[assembly: AssemblyCopyright ("Copyright ©  2009")]
+[assembly: AssemblyTrademark ("")]
+[assembly: AssemblyCulture ("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible (false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid ("a9480a45-3ca3-4372-ab8b-56ad4f13520c")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion ("1.0.0.0")]
+[assembly: AssemblyFileVersion ("1.0.0.0")]
diff --git a/UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs b/UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs
new file mode 100644
index 0000000..c9962fe
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/AutomationElementTest.cs
@@ -0,0 +1,1379 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+// 
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using System.Windows;
+using System.Windows.Automation;
+using At = System.Windows.Automation.Automation;
+using System.Linq;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+using NUnit.Framework;
+
+namespace MonoTests.System.Windows.Automation
+{
+	[TestFixture]
+	public class AutomationElementTest : BaseTest
+	{
+		#region Test Methods
+
+		[Test]
+		public void AcceleratorKeyTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.AcceleratorKeyProperty),
+				button1Element.Current.AcceleratorKey,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.AcceleratorKeyProperty, true),
+					button1Element.Current.AcceleratorKey,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+			// TODO: Complete actual test (mostly unimplemented in Linux right now)
+		}
+
+		[Test]
+		public void AccessKeyTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.AccessKeyProperty),
+				button1Element.Current.AccessKey,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.AccessKeyProperty, true),
+					button1Element.Current.AccessKey,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.AreEqual ("Alt+u",
+				button1Element.Current.AccessKey,
+				"button1");
+			Assert.AreEqual (String.Empty,
+				button2Element.Current.AccessKey,
+				"button2");
+		}
+
+		[Test]
+		public void AutomationIdTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.AutomationIdProperty),
+				button1Element.Current.AutomationId,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.AutomationIdProperty, true),
+					button1Element.Current.AutomationId,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+			// TODO: Complete actual test (implemented incorrectly in Linux right now)
+		}
+
+		[Test]
+		public void BoundingRectangleTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.BoundingRectangleProperty),
+				button1Element.Current.BoundingRectangle,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.BoundingRectangleProperty, true),
+					button1Element.Current.BoundingRectangle,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			// TODO: Coordinates, not just size (not matching in Linux yet)
+			Rect button2Rect = button2Element.Current.BoundingRectangle;
+			if (!Atspi) {
+				Assert.AreEqual (128,
+					button2Rect.Width,
+					"button2 width");
+				Assert.AreEqual (23,
+					button2Rect.Height,
+					"button2 height");
+			}
+
+			Rect button3Rect = button3Element.Current.BoundingRectangle;
+			if (!Atspi) {
+				Assert.AreEqual (75,
+					button3Rect.Width,
+					"button3 width");
+				Assert.AreEqual (23,
+					button3Rect.Height,
+					"button3 height");
+			}
+
+			var propertyEventsArray = new [] {
+				new {Sender = (object) null, Args = (AutomationPropertyChangedEventArgs) null}};
+			var propertyEvents = propertyEventsArray.ToList ();
+			propertyEvents.Clear ();
+
+			AutomationElement element = (Atspi ? treeView1Element : testFormElement);
+
+			AutomationPropertyChangedEventHandler handler =
+				(o, e) => propertyEvents.Add (new { Sender = o, Args = e });
+			At.AddAutomationPropertyChangedEventHandler (element,
+			                                             TreeScope.Element, handler,
+			                                             AutomationElement.BoundingRectangleProperty);
+
+			if (Atspi) {
+				AutomationElement parentElement;
+				parentElement = treeView1Element.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.TreeItem));
+				ExpandCollapsePattern pattern = (ExpandCollapsePattern) parentElement.GetCurrentPattern (ExpandCollapsePatternIdentifiers.Pattern);
+				pattern.Expand ();
+			} else
+				RunCommand ("MoveTo.Origin");
+Thread.Sleep(1000);
+			Assert.AreEqual (1, propertyEvents.Count, "event count");
+			Assert.AreEqual (element, propertyEvents [0].Sender, "event sender");
+			Assert.AreEqual (AutomationElement.BoundingRectangleProperty, propertyEvents [0].Args.Property, "property");
+			Assert.AreEqual (Rect.Empty, propertyEvents [0].Args.OldValue, "old value");
+			Assert.AreNotEqual (Rect.Empty, propertyEvents [0].Args.NewValue, "new value");
+		}
+
+		[Test]
+		public void ClassNameTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.ClassNameProperty),
+				button1Element.Current.ClassName,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			// TODO: Complete actual test (totally unimplemented in Linux right now)
+		}
+
+		[Test]
+		public void ControlTypeTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.ControlTypeProperty),
+				button1Element.Current.ControlType,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.ControlTypeProperty, true),
+					button1Element.Current.ControlType,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.AreEqual (ControlType.Window,
+				testFormElement.Current.ControlType,
+				"window");
+			Assert.AreEqual (ControlType.Button,
+				button3Element.Current.ControlType,
+				"button3");
+		}
+
+		[Test]
+		[Ignore ("Not implemented, not sure how to test on Windows")]
+		public void CultureTest ()
+		{
+			// TODO: How to test actual values in Windows?
+			//Assert.AreEqual (new CultureInfo ("en-US"),
+			//        testFormElement.GetCurrentPropertyValue (AEIds.CultureProperty),
+			//        "button1 Culture");
+		}
+
+		[Test]
+		public void FrameworkIdTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.FrameworkIdProperty),
+				button1Element.Current.FrameworkId,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.FrameworkIdProperty, true),
+					button1Element.Current.FrameworkId,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.AreEqual ("WinForm",
+				testFormElement.Current.FrameworkId,
+				"window");
+			Assert.AreEqual ("WinForm",
+				label1Element.Current.FrameworkId,
+				"label1");
+		}
+
+		[Test]
+		public void GetCurrentPropertyValueTest ()
+		{
+			// A typical supported property
+			VerifyCurrentPropertyValue (testFormElement,
+				AEIds.NameProperty,
+				"TestForm1",
+				"TestForm1",
+				"TestForm1");
+
+			// A typical unsupported property
+			VerifyCurrentPropertyValue (testFormElement,
+				AEIds.OrientationProperty,
+				AutomationElement.NotSupported,
+				OrientationType.None,
+				OrientationType.None);
+
+			// TODO: Additional things to test (when pattern support implemented)
+			//	2. Supported pattern props, true/false/default
+			//	3. Unsupported pattern proprs, true/false/default
+		}
+
+		[Test]
+		public void GetCurrentPatternExceptionTest ()
+		{
+			AssertRaises<InvalidOperationException> (
+				() => testFormElement.GetCurrentPattern (InvokePattern.Pattern),
+				"calling GetCurrentPattern with unsupported pattern");
+			AssertRaises<ArgumentNullException> (
+				() => testFormElement.GetCurrentPattern (null),
+				"calling GetCurrentPattern with null pattern");
+		}
+
+		[Test]
+		public void HasKeyboardFocusTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.HasKeyboardFocusProperty),
+				button1Element.Current.HasKeyboardFocus,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.HasKeyboardFocusProperty, true),
+					button1Element.Current.HasKeyboardFocus,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			var propertyEventsArray = new [] {
+				new {Sender = (object) null, Args = (AutomationPropertyChangedEventArgs) null}};
+			var propertyEvents = propertyEventsArray.ToList ();
+			propertyEvents.Clear ();
+
+			AutomationPropertyChangedEventHandler propertyHandler =
+				(o, e) => propertyEvents.Add (new { Sender = o, Args = e });
+			At.AddAutomationPropertyChangedEventHandler (button2Element,
+			                                             TreeScope.Element, propertyHandler,
+			                                             AutomationElement.HasKeyboardFocusProperty);
+
+			button2Element.SetFocus ();
+			Thread.Sleep (100);
+			Assert.IsFalse (button1Element.Current.HasKeyboardFocus, "button1, no focus");
+			Assert.AreEqual (1, propertyEvents.Count, "event count");
+			Assert.AreEqual (button2Element, propertyEvents [0].Sender, "event sender");
+			Assert.AreEqual (AutomationElement.HasKeyboardFocusProperty, propertyEvents [0].Args.Property, "property");
+			Assert.AreEqual (true, propertyEvents [0].Args.NewValue, "new value");
+			Assert.AreEqual (false, propertyEvents [0].Args.OldValue, "old value");
+
+			propertyEvents.Clear ();
+			button1Element.SetFocus ();
+			Thread.Sleep (100);
+			Assert.IsTrue (button1Element.Current.HasKeyboardFocus, "button1, w/ focus");
+			Assert.AreEqual (0, propertyEvents.Count, "event count");
+			//Assert.AreEqual (1, propertyEvents.Count, "event count");
+			//Assert.AreEqual (button2Element, propertyEvents [0].Sender, "event sender");
+			//Assert.AreEqual (AutomationElement.HasKeyboardFocusProperty, propertyEvents [0].Args.Property, "property");
+			//Assert.AreEqual (false, propertyEvents [0].Args.NewValue, "new value");
+			//Assert.AreEqual (true, propertyEvents [0].Args.OldValue, "old value");
+
+			At.RemoveAutomationPropertyChangedEventHandler (button2Element,
+			                                             propertyHandler);
+		}
+
+		[Test]
+		public void HelpTextTest ()
+		{
+			Assert.AreEqual (button3Element.GetCurrentPropertyValue (AEIds.HelpTextProperty),
+				button3Element.Current.HelpText,
+				"button3 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button3Element.GetCurrentPropertyValue (AEIds.HelpTextProperty, true),
+					button3Element.Current.HelpText,
+					"button3 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.AreEqual ("help text 3",
+				button3Element.Current.HelpText,
+				"button3");
+			Assert.AreEqual (String.Empty,
+				button1Element.Current.HelpText,
+				"button1");
+
+			var propertyEventsArray = new [] {
+				new {Sender = (object) null, Args = (AutomationPropertyChangedEventArgs) null}};
+			var propertyEvents = propertyEventsArray.ToList ();
+			propertyEvents.Clear ();
+
+			AutomationPropertyChangedEventHandler handler =
+				(o, e) => propertyEvents.Add (new { Sender = o, Args = e });
+			At.AddAutomationPropertyChangedEventHandler (button3Element,
+			                                             TreeScope.Element, handler,
+			                                             AutomationElement.NameProperty);
+
+			RunCommand ("change button3 helptext");
+
+			Assert.AreEqual ("plugh", button3Element.Current.HelpText, "HelpText after set");
+			Assert.AreEqual (0, propertyEvents.Count, "event count");
+			//Assert.AreEqual (1, propertyEvents.Count, "event count");
+			//Assert.AreEqual (button3Element, propertyEvents [0].Sender, "event sender");
+			//Assert.AreEqual (AutomationElement.HelpTextProperty, propertyEvents [0].Args.Property, "property");
+			//Assert.AreEqual ("plugh", propertyEvents [0].Args.NewValue, "new value");
+			//Assert.AreEqual ("help text 3", propertyEvents [0].Args.OldValue, "old value");
+
+			At.RemoveAutomationPropertyChangedEventHandler (button3Element,
+			                                             handler);
+		}
+
+		[Test]
+		public void IsContentTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.IsContentElementProperty),
+				button1Element.Current.IsContentElement,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+
+			Assert.IsTrue (testFormElement.Current.IsContentElement,
+				"window");
+			if (Atspi)
+				Assert.IsTrue (label1Element.Current.IsContentElement,
+				"label1");
+			else	// this is weird; not replicating it in Atspi
+				Assert.IsFalse (label1Element.Current.IsContentElement,
+				"label1");
+		}
+
+		[Test]
+		public void IsControlTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.IsControlElementProperty),
+				button1Element.Current.IsControlElement,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+
+			Assert.IsTrue (testFormElement.Current.IsControlElement,
+				"window");
+			Assert.IsTrue (label1Element.Current.IsControlElement,
+				"label1");
+		}
+
+		[Test]
+		public void IsEnabledTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.IsEnabledProperty),
+				button1Element.Current.IsEnabled,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.IsEnabledProperty, true),
+					button1Element.Current.IsEnabled,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.IsTrue (testFormElement.Current.IsEnabled,
+				"window");
+			Assert.IsTrue (label1Element.Current.IsEnabled,
+				"label1");
+			Assert.IsTrue (groupBox1Element.Current.IsEnabled,
+				"groupBox1");
+			Assert.IsTrue (button1Element.Current.IsEnabled,
+				"button1");
+			Assert.IsTrue (button2Element.Current.IsEnabled,
+				"button2");
+			Assert.IsFalse (button3Element.Current.IsEnabled,
+				"button3");
+
+			var propertyEventsArray = new [] {
+				new {Sender = (object) null, Args = (AutomationPropertyChangedEventArgs) null}};
+			var propertyEvents = propertyEventsArray.ToList ();
+			propertyEvents.Clear ();
+
+			AutomationPropertyChangedEventHandler handler =
+				(o, e) => propertyEvents.Add (new { Sender = o, Args = e });
+			At.AddAutomationPropertyChangedEventHandler (button3Element,
+			                                             TreeScope.Element, handler,
+			                                             AutomationElement.IsEnabledProperty);
+
+			RunCommand ("enable button3");
+			if (Atspi)
+				Thread.Sleep (100);
+
+			Assert.AreEqual (1, propertyEvents.Count, "event count");
+			Assert.AreEqual (button3Element, propertyEvents [0].Sender, "event sender");
+			Assert.AreEqual (AutomationElement.IsEnabledProperty, propertyEvents [0].Args.Property, "property");
+			Assert.AreEqual (true, propertyEvents [0].Args.NewValue, "new value");
+			Assert.AreEqual (false, propertyEvents [0].Args.OldValue, "old value");
+
+			RunCommand ("disable button3");
+			At.RemoveAutomationPropertyChangedEventHandler (button3Element,
+			                                             handler);
+		}
+
+		[Test]
+		public void IsKeyboardFocusableTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.IsKeyboardFocusableProperty),
+				button1Element.Current.IsKeyboardFocusable,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.IsKeyboardFocusableProperty, true),
+					button1Element.Current.IsKeyboardFocusable,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.IsTrue (testFormElement.Current.IsKeyboardFocusable,
+				"window");
+			Assert.IsFalse (label1Element.Current.IsKeyboardFocusable,
+				"label1");
+			Assert.IsFalse (groupBox1Element.Current.IsKeyboardFocusable,
+				"groupBox1");
+			Assert.IsTrue (button1Element.Current.IsKeyboardFocusable,
+				"button1");
+			Assert.IsTrue (button2Element.Current.IsKeyboardFocusable,
+				"button2");
+			Assert.IsFalse (button3Element.Current.IsKeyboardFocusable,
+				"button3");
+		}
+
+		[Test]
+		public void IsOffscreenTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.IsOffscreenProperty),
+				button1Element.Current.IsOffscreen,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.IsOffscreenProperty, true),
+					button1Element.Current.IsOffscreen,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+			// TODO: Complete actual test (requires pattern support to move window)
+		}
+
+		[Test]
+		public void IsPasswordTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.IsPasswordProperty),
+				button1Element.Current.IsPassword,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.IsPasswordProperty, true),
+					button1Element.Current.IsPassword,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.IsFalse (textbox1Element.Current.IsPassword,
+				"textbox1");
+			Assert.IsTrue (textbox2Element.Current.IsPassword,
+				"textbox2");
+		}
+
+		[Test]
+		public void IsRequiredForFormTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.IsRequiredForFormProperty),
+				button1Element.Current.IsRequiredForForm,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			// TODO: Complete actual test (totally unimplemented in Linux right now)
+		}
+
+		[Test]
+		public void ItemStatusTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.ItemStatusProperty),
+				button1Element.Current.ItemStatus,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			// TODO: Complete actual test (totally unimplemented in Linux right now)
+		}
+
+		[Test]
+		public void ItemTypeTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.ItemTypeProperty),
+				button1Element.Current.ItemType,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			// TODO: Complete actual test (totally unimplemented in Linux right now)
+		}
+
+		[Test]
+		public void LabeledByTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.LabeledByProperty),
+				button1Element.Current.LabeledBy,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.LabeledByProperty, true),
+					button1Element.Current.LabeledBy,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.AreEqual (label1Element,
+				button1Element.Current.LabeledBy,
+				"button1");
+			Assert.AreEqual (null,
+				button2Element.Current.LabeledBy,
+				"button2");
+			Assert.AreEqual (null,
+				textbox1Element.Current.LabeledBy,
+				"textbox1");
+			Assert.AreEqual (null,
+				textbox2Element.Current.LabeledBy,
+				"textbox2Element");
+		}
+
+		[Test]
+		public void LocalizedControlTypeTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.LocalizedControlTypeProperty),
+				button1Element.Current.LocalizedControlType,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.LocalizedControlTypeProperty, true),
+					button1Element.Current.LocalizedControlType,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.AreEqual (ControlType.Window.LocalizedControlType,
+				testFormElement.Current.LocalizedControlType,
+				"window");
+			Assert.AreEqual (ControlType.Button.LocalizedControlType,
+				button3Element.Current.LocalizedControlType,
+				"button3");
+		}
+
+		[Test]
+		public void NameTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.NameProperty),
+				button1Element.Current.Name,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.NameProperty, true),
+					button1Element.Current.Name,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.AreEqual ("TestForm1",
+				testFormElement.Current.Name,
+				"window");
+			Assert.AreEqual ("groupBox1",
+				groupBox1Element.Current.Name,
+				"groupBox1");
+			Assert.AreEqual ("button1",
+				button1Element.Current.Name,
+				"button1");
+			Assert.AreEqual (label1Element.Current.Name,
+				textbox1Element.Current.Name,
+				"textbox1");
+			Assert.AreEqual (String.Empty,
+				textbox2Element.Current.Name,
+				"textbox2");
+
+			var propertyEventsArray = new [] {
+				new {Sender = (object) null, Args = (AutomationPropertyChangedEventArgs) null}};
+			var propertyEvents = propertyEventsArray.ToList ();
+			propertyEvents.Clear ();
+
+			AutomationPropertyChangedEventHandler handler =
+				(o, e) => propertyEvents.Add (new { Sender = o, Args = e });
+			At.AddAutomationPropertyChangedEventHandler (button3Element,
+			                                             TreeScope.Element, handler,
+			                                             AutomationElement.NameProperty);
+
+			RunCommand ("change button3 name");
+			Assert.AreEqual ("xyzzy", button3Element.Current.Name, "Name after set");
+			Assert.AreEqual (0, propertyEvents.Count, "event count");
+			//Assert.AreEqual (1, propertyEvents.Count, "event count");
+			//Assert.AreEqual (button3Element, propertyEvents [0].Sender, "event sender");
+			//Assert.AreEqual (AutomationElement.NameProperty, propertyEvents [0].Args.Property, "property");
+			//Assert.AreEqual ("xyzzy", propertyEvents [0].Args.NewValue, "new value");
+			//Assert.AreEqual ("button3", propertyEvents [0].Args.OldValue, "old value");
+
+			At.RemoveAutomationPropertyChangedEventHandler (button3Element,
+			                                             handler);
+		}
+
+		[Test]
+		public void NativeWindowHandleTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.NativeWindowHandleProperty),
+				button1Element.Current.NativeWindowHandle,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+
+			Assert.AreNotEqual (testFormElement.Current.NativeWindowHandle,
+				label1Element.Current.NativeWindowHandle,
+				"Control handles should differ");
+		}
+
+		[Test]
+		public void OrientationTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.OrientationProperty),
+				button1Element.Current.Orientation,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.OrientationProperty, true),
+					button1Element.Current.Orientation,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.AreEqual (OrientationType.None,
+				testFormElement.Current.Orientation,
+				"Orientation of Window (unsupported)");
+
+			Assert.AreEqual (tb3verticalScrollBarElement.GetCurrentPropertyValue (AEIds.OrientationProperty),
+				tb3verticalScrollBarElement.Current.Orientation,
+				"tb3verticalScrollBarElement AutomationElementInformation vs GetCurrentPropertyValue");
+			Assert.AreEqual (OrientationType.Vertical,
+				tb3verticalScrollBarElement.Current.Orientation,
+				"Orientation of vertical scroll bar");
+
+			Assert.AreEqual (tb3horizontalScrollBarElement.GetCurrentPropertyValue (AEIds.OrientationProperty),
+				tb3horizontalScrollBarElement.Current.Orientation,
+				"tb3horizontalScrollBarElement AutomationElementInformation vs GetCurrentPropertyValue");
+			Assert.AreEqual (OrientationType.Horizontal,
+				tb3horizontalScrollBarElement.Current.Orientation,
+				"Orientation of horizontal scroll bar");
+		}
+
+		[Test]
+		public void ProcessIdTest ()
+		{
+			Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.ProcessIdProperty),
+				button1Element.Current.ProcessId,
+				"button1 AutomationElementInformation vs GetCurrentPropertyValue");
+			if (Atspi)
+				Assert.AreEqual (button1Element.GetCurrentPropertyValue (AEIds.ProcessIdProperty, true),
+					button1Element.Current.ProcessId,
+					"button1 AutomationElementInformation vs GetCurrentPropertyValue w/ignoreDefault");
+
+			Assert.AreEqual (p.Id,
+				testFormElement.Current.ProcessId,
+				"Form");
+			Assert.AreEqual (p.Id,
+				label1Element.Current.ProcessId,
+				"label");
+		}
+
+		[Test]
+		public void DockPositionTest ()
+		{
+			Assert.AreEqual (DockPosition.None, (DockPosition)AutomationElement.RootElement.GetCurrentPropertyValue (DockPatternIdentifiers.DockPositionProperty), "DockPosition of root element (unsupported)");
+		}
+
+		[Test]
+		public void ExpandCollapseStateTest ()
+		{
+			Assert.AreEqual (ExpandCollapseState.LeafNode, (ExpandCollapseState)AutomationElement.RootElement.GetCurrentPropertyValue (ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty), "ExpandCollapseState of root element (unsupported)");
+		}
+
+		[Test]
+		public void ColumnTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (GridItemPatternIdentifiers.ColumnProperty), "Column of root element (unsupported)");
+		}
+
+		[Test]
+		public void ColumnSpanTest ()
+		{
+			Assert.AreEqual (1, AutomationElement.RootElement.GetCurrentPropertyValue (GridItemPatternIdentifiers.ColumnSpanProperty), "ColumnSpan of root element (unsupported)");
+		}
+
+		[Test]
+		public void ContainingGridTest ()
+		{
+			Assert.IsNull (AutomationElement.RootElement.GetCurrentPropertyValue (GridItemPatternIdentifiers.ContainingGridProperty), "ContainingGrid of root element (unsupported)");
+		}
+
+		[Test]
+		public void RowTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (GridItemPatternIdentifiers.RowProperty), "Row of root element (unsupported)");
+		}
+
+		[Test]
+		public void RowSpanTest ()
+		{
+			Assert.AreEqual (1, AutomationElement.RootElement.GetCurrentPropertyValue (GridItemPatternIdentifiers.RowSpanProperty), "RowSpan of root element (unsupported)");
+		}
+
+		[Test]
+		public void ColumnCountTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (GridPatternIdentifiers.ColumnCountProperty), "ColumnCount of root element (unsupported)");
+		}
+
+		[Test]
+		public void RowCountTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (GridPatternIdentifiers.RowCountProperty), "RowCount of root element (unsupported)");
+		}
+
+		[Test]
+		public void CurrentViewTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (MultipleViewPatternIdentifiers.CurrentViewProperty), "CurrentView of root element (unsupported)");
+		}
+
+		[Test]
+		public void SupportedViewsTest ()
+		{
+			Assert.AreEqual (new int [0], AutomationElement.RootElement.GetCurrentPropertyValue (MultipleViewPatternIdentifiers.SupportedViewsProperty), "SupportedViews of root element (unsupported)");
+		}
+
+		[Test]
+		public void RangeValueIsReadOnlyTest ()
+		{
+			Assert.IsTrue ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (RangeValuePatternIdentifiers.IsReadOnlyProperty), "IsReadOnly of root element (unsupported)");
+		}
+
+		[Test]
+		public void LargeChangeTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (RangeValuePatternIdentifiers.LargeChangeProperty), "LargeChange of root element (unsupported)");
+		}
+
+		[Test]
+		public void MaximumTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (RangeValuePatternIdentifiers.MaximumProperty), "Maximum of root element (unsupported)");
+		}
+
+		[Test]
+		public void MinimumTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (RangeValuePatternIdentifiers.MinimumProperty), "Minimum of root element (unsupported)");
+		}
+
+		[Test]
+		public void SmallChangeTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (RangeValuePatternIdentifiers.SmallChangeProperty), "SmallChange of root element (unsupported)");
+		}
+
+		[Test]
+		public void RangeValueValueTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (RangeValuePatternIdentifiers.ValueProperty), "Value of root element (unsupported)");
+		}
+
+		[Test]
+		public void HorizontallyScrollableTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (ScrollPatternIdentifiers.HorizontallyScrollableProperty), "HorizontallyScrollable of root element (unsupported)");
+		}
+
+		[Test]
+		public void HorizontalScrollPercentTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (ScrollPatternIdentifiers.HorizontalScrollPercentProperty), "HorizontalScrollPercent of root element (unsupported)");
+		}
+
+		[Test]
+		public void HorizontalViewSizeTest ()
+		{
+			Assert.AreEqual (100, AutomationElement.RootElement.GetCurrentPropertyValue (ScrollPatternIdentifiers.HorizontalViewSizeProperty), "HorizontalViewSize of root element (unsupported)");
+		}
+
+		[Test]
+		public void VerticallyScrollableTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (ScrollPatternIdentifiers.VerticallyScrollableProperty), "VerticallyScrollable of root element (unsupported)");
+		}
+
+		[Test]
+		public void VerticalScrollPercentTest ()
+		{
+			Assert.AreEqual (0, AutomationElement.RootElement.GetCurrentPropertyValue (ScrollPatternIdentifiers.VerticalScrollPercentProperty), "VerticalScrollPercent of root element (unsupported)");
+		}
+
+		[Test]
+		public void VerticalViewSizeTest ()
+		{
+			Assert.AreEqual (100, AutomationElement.RootElement.GetCurrentPropertyValue (ScrollPatternIdentifiers.VerticalViewSizeProperty), "VerticalViewSize of root element (unsupported)");
+		}
+
+		[Test]
+		public void IsSelectedTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (SelectionItemPatternIdentifiers.IsSelectedProperty), "IsSelected of root element (unsupported)");
+		}
+
+		[Test]
+		public void SelectionContainerTest ()
+		{
+			Assert.IsNull (AutomationElement.RootElement.GetCurrentPropertyValue (SelectionItemPatternIdentifiers.SelectionContainerProperty), "SelectionContainer of root element (unsupported)");
+		}
+
+		[Test]
+		public void CanSelectMultipleTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (SelectionPatternIdentifiers.CanSelectMultipleProperty), "CanSelectMultiple of root element (unsupported)");
+		}
+
+		[Test]
+		public void IsSelectionRequiredTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (SelectionPatternIdentifiers.IsSelectionRequiredProperty), "IsSelectionRequired of root element (unsupported)");
+		}
+
+		[Test]
+		public void SelectionTest ()
+		{
+			Assert.AreEqual (new AutomationElement [0], AutomationElement.RootElement.GetCurrentPropertyValue (SelectionPatternIdentifiers.SelectionProperty), "Selection of root element (unsupported)");
+		}
+
+		[Test]
+		public void ColumnHeaderItemsTest ()
+		{
+			Assert.AreEqual (new AutomationElement [0], AutomationElement.RootElement.GetCurrentPropertyValue (TableItemPatternIdentifiers.ColumnHeaderItemsProperty), "ColumnHeaderItems of root element (unsupported)");
+		}
+
+		[Test]
+		public void RowHeaderItemsTest ()
+		{
+			Assert.AreEqual (new AutomationElement [0], AutomationElement.RootElement.GetCurrentPropertyValue (TableItemPatternIdentifiers.RowHeaderItemsProperty), "ColumnHeaderItems of root element (unsupported)");
+		}
+
+		[Test]
+		public void ColumnHeadersTest ()
+		{
+			Assert.AreEqual (new AutomationElement [0], AutomationElement.RootElement.GetCurrentPropertyValue (TablePatternIdentifiers.ColumnHeadersProperty), "ColumnHeaderItems of root element (unsupported)");
+		}
+
+		[Test]
+		public void RowHeadersTest ()
+		{
+			Assert.AreEqual (new AutomationElement [0], AutomationElement.RootElement.GetCurrentPropertyValue (TablePatternIdentifiers.RowHeadersProperty), "RowHeaders of root element (unsupported)");
+		}
+
+		[Test]
+		public void RowOrColumnMajorTest ()
+		{
+			Assert.AreEqual (RowOrColumnMajor.Indeterminate, AutomationElement.RootElement.GetCurrentPropertyValue (TablePatternIdentifiers.RowOrColumnMajorProperty), "RowOrColumnMajor of root element (unsupported)");
+		}
+
+		[Test]
+		public void ToggleStateTest ()
+		{
+			Assert.AreEqual (ToggleState.Indeterminate, AutomationElement.RootElement.GetCurrentPropertyValue (TogglePatternIdentifiers.ToggleStateProperty), "ToggleState of root element (unsupported)");
+		}
+
+		[Test]
+		public void CanMoveTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (TransformPatternIdentifiers.CanMoveProperty), "CanMove of root element (unsupported)");
+		}
+
+		[Test]
+		public void CanResizeTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (TransformPatternIdentifiers.CanResizeProperty), "CanResize of root element (unsupported)");
+		}
+
+		[Test]
+		public void ValueIsReadOnlyTest ()
+		{
+			Assert.IsTrue ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (ValuePatternIdentifiers.IsReadOnlyProperty), "IsReadOnly of root element (unsupported)");
+		}
+
+		[Test]
+		public void ValueValueTest ()
+		{
+			Assert.AreEqual (String.Empty, AutomationElement.RootElement.GetCurrentPropertyValue (ValuePatternIdentifiers.ValueProperty), "Value of root element (unsupported)");
+		}
+
+		[Test]
+		public void CanMaximizeTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (WindowPatternIdentifiers.CanMaximizeProperty), "CanMaximize of root element (unsupported)");
+		}
+
+		[Test]
+		public void CanMinimizeTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (WindowPatternIdentifiers.CanMinimizeProperty), "CanMinimize of root element (unsupported)");
+		}
+
+		[Test]
+		public void IsModalTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (WindowPatternIdentifiers.IsModalProperty), "IsModal of root element (unsupported)");
+		}
+
+		[Test]
+		public void IsTopmostTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (WindowPatternIdentifiers.IsTopmostProperty), "IsTopmost of root element (unsupported)");
+		}
+
+		[Test]
+		public void WindowInteractionStateTest ()
+		{
+			Assert.AreEqual (WindowInteractionState.Running, AutomationElement.RootElement.GetCurrentPropertyValue (WindowPatternIdentifiers.WindowInteractionStateProperty), "WindowInteractionState of root element (unsupported)");
+		}
+
+		[Test]
+		public void WindowVisualStateTest ()
+		{
+			Assert.AreEqual (WindowVisualState.Normal, AutomationElement.RootElement.GetCurrentPropertyValue (WindowPatternIdentifiers.WindowVisualStateProperty), "WindowVisualState of root element (unsupported)");
+		}
+
+		[Test]
+		public void CanRotateTest ()
+		{
+			Assert.IsFalse ((bool)AutomationElement.RootElement.GetCurrentPropertyValue (TransformPatternIdentifiers.CanRotateProperty), "CanRotate of root element (unsupported)");
+		}
+
+		[Test]
+		public void EqualsTest ()
+		{
+			AutomationElement button1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"button1"));
+			Assert.IsTrue (button1Element.Equals (button1ElementRef2), "Comparing two references to button1 element");
+			Assert.IsFalse (button1Element.Equals (button2Element), "Comparing button1 and button2 elements");
+			// TODO: Compare after modifying, ie references have different cached info values
+		}
+
+		[Test]
+		public void FindFirstTest ()
+		{
+			// TreeScope.Children
+			VerifyFindFirst (testFormElement,
+				TreeScope.Children,
+				new AutomationElement [] { button1Element, label1Element },
+				new AutomationElement [] { testFormElement, button3Element });
+			VerifyFindFirst (groupBox1Element,
+				TreeScope.Children,
+				new AutomationElement [] { button3Element },
+				new AutomationElement [] { groupBox1Element, button1Element });
+
+			// TreeScope.Descendants
+			VerifyFindFirst (testFormElement,
+				TreeScope.Descendants,
+				new AutomationElement [] { button1Element, label1Element, button3Element },
+				new AutomationElement [] { testFormElement });
+			VerifyFindFirst (groupBox1Element,
+				TreeScope.Descendants,
+				new AutomationElement [] { button3Element },
+				new AutomationElement [] { groupBox1Element, button1Element });
+
+			// TreeScope.Subtree
+			VerifyFindFirst (testFormElement,
+				TreeScope.Subtree,
+				new AutomationElement [] { button1Element, label1Element, testFormElement, button3Element },
+				new AutomationElement [] { });
+			VerifyFindFirst (groupBox1Element,
+				TreeScope.Subtree,
+				new AutomationElement [] { button3Element, groupBox1Element },
+				new AutomationElement [] { button1Element });
+
+			// TreeScope.Ancestors
+			AssertRaises<ArgumentException> (
+				() => groupBox1Element.FindFirst (TreeScope.Ancestors, new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Window)),
+				"using TreeScope.Ancestors");
+
+			// TreeScope.Parent
+			AssertRaises<ArgumentException> (
+				() => groupBox1Element.FindFirst (TreeScope.Parent, new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Window)),
+				"using TreeScope.Parent");
+
+			// Test search order, conditions (also tested in FindAllTest and FixtureSetUp)
+			AutomationElement firstFound =
+				groupBox1Element.FindFirst (TreeScope.Descendants,
+				new AndCondition (new PropertyCondition (AEIds.OrientationProperty, OrientationType.None),
+					new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Button)));
+			Assert.AreEqual (button7Element, firstFound, "In Descendants, first element added found first. " +
+				String.Format ("Expected element named {0}, got element named {1}", button7Element.Current.Name, firstFound.Current.Name));
+			firstFound =
+				groupBox1Element.FindFirst (TreeScope.Subtree,
+				new PropertyCondition (AEIds.OrientationProperty, OrientationType.None));
+			Assert.AreEqual (groupBox1Element, firstFound, "In Subtree, root found before descendants");
+
+			// FindFirst returns a new instance
+			var groupBox1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Group));
+			Assert.AreEqual (groupBox1Element, groupBox1ElementRef2, "FindFirst returns equivalent element");
+			Assert.AreNotSame (groupBox1Element, groupBox1ElementRef2, "FindFirst returns different instance");
+		}
+
+		[Test]
+		public void FindAllTest ()
+		{
+			VerifyFindAll (testFormElement,
+				TreeScope.Descendants,
+				new PropertyCondition (AutomationElement.ControlTypeProperty, ControlType.Button),
+				new AutomationElement [] { button1Element, button2Element, button3Element });
+			VerifyFindAll (testFormElement,
+				TreeScope.Children,
+				new PropertyCondition (AutomationElement.ControlTypeProperty, ControlType.Button),
+				new AutomationElement [] { button1Element });
+
+			// TreeScope.Ancestors
+			AssertRaises<ArgumentException> (
+				() => groupBox1Element.FindAll (TreeScope.Ancestors, new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Window)),
+				"using TreeScope.Ancestors");
+
+			// TreeScope.Parent
+			AssertRaises<ArgumentException> (
+				() => groupBox1Element.FindAll (TreeScope.Parent, new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Window)),
+				"using TreeScope.Parent");
+		}
+
+		[Test]
+		public void StaticFieldsTest ()
+		{
+			Assert.IsTrue (AEIds.AcceleratorKeyProperty == AutomationElement.AcceleratorKeyProperty, "AcceleratorKeyProperty");
+			Assert.IsTrue (AEIds.AccessKeyProperty == AutomationElement.AccessKeyProperty, "AccessKeyProperty");
+			Assert.IsTrue (AEIds.AutomationIdProperty == AutomationElement.AutomationIdProperty, "AutomationIdProperty");
+			Assert.IsTrue (AEIds.BoundingRectangleProperty == AutomationElement.BoundingRectangleProperty, "BoundingRectangleProperty");
+			Assert.IsTrue (AEIds.ClassNameProperty == AutomationElement.ClassNameProperty, "ClassNameProperty");
+			Assert.IsTrue (AEIds.ClickablePointProperty == AutomationElement.ClickablePointProperty, "ClickablePointProperty");
+			Assert.IsTrue (AEIds.ControlTypeProperty == AutomationElement.ControlTypeProperty, "ControlTypeProperty");
+			Assert.IsTrue (AEIds.CultureProperty == AutomationElement.CultureProperty, "CultureProperty");
+			Assert.IsTrue (AEIds.FrameworkIdProperty == AutomationElement.FrameworkIdProperty, "FrameworkIdProperty");
+			Assert.IsTrue (AEIds.HasKeyboardFocusProperty == AutomationElement.HasKeyboardFocusProperty, "HasKeyboardFocusProperty");
+			Assert.IsTrue (AEIds.HelpTextProperty == AutomationElement.HelpTextProperty, "HelpTextProperty");
+			Assert.IsTrue (AEIds.IsContentElementProperty == AutomationElement.IsContentElementProperty, "IsContentElementProperty");
+			Assert.IsTrue (AEIds.IsControlElementProperty == AutomationElement.IsControlElementProperty, "IsControlElementProperty");
+			Assert.IsTrue (AEIds.IsDockPatternAvailableProperty == AutomationElement.IsDockPatternAvailableProperty, "IsDockPatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsEnabledProperty == AutomationElement.IsEnabledProperty, "IsEnabledProperty");
+			Assert.IsTrue (AEIds.IsExpandCollapsePatternAvailableProperty == AutomationElement.IsExpandCollapsePatternAvailableProperty, "IsExpandCollapsePatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsGridItemPatternAvailableProperty == AutomationElement.IsGridItemPatternAvailableProperty, "IsGridItemPatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsGridPatternAvailableProperty == AutomationElement.IsGridPatternAvailableProperty, "IsGridPatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsInvokePatternAvailableProperty == AutomationElement.IsInvokePatternAvailableProperty, "IsInvokePatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsKeyboardFocusableProperty == AutomationElement.IsKeyboardFocusableProperty, "IsKeyboardFocusableProperty");
+			Assert.IsTrue (AEIds.IsMultipleViewPatternAvailableProperty == AutomationElement.IsMultipleViewPatternAvailableProperty, "IsMultipleViewPatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsOffscreenProperty == AutomationElement.IsOffscreenProperty, "IsOffscreenProperty");
+			Assert.IsTrue (AEIds.IsPasswordProperty == AutomationElement.IsPasswordProperty, "IsPasswordProperty");
+			Assert.IsTrue (AEIds.IsRangeValuePatternAvailableProperty == AutomationElement.IsRangeValuePatternAvailableProperty, "IsRangeValuePatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsRequiredForFormProperty == AutomationElement.IsRequiredForFormProperty, "IsRequiredForFormProperty");
+			Assert.IsTrue (AEIds.IsScrollItemPatternAvailableProperty == AutomationElement.IsScrollItemPatternAvailableProperty, "IsScrollItemPatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsScrollPatternAvailableProperty == AutomationElement.IsScrollPatternAvailableProperty, "IsScrollPatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsSelectionItemPatternAvailableProperty == AutomationElement.IsSelectionItemPatternAvailableProperty, "IsSelectionItemPatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsSelectionPatternAvailableProperty == AutomationElement.IsSelectionPatternAvailableProperty, "IsSelectionPatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsTableItemPatternAvailableProperty == AutomationElement.IsTableItemPatternAvailableProperty, "IsTableItemPatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsTablePatternAvailableProperty == AutomationElement.IsTablePatternAvailableProperty, "IsTablePatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsTextPatternAvailableProperty == AutomationElement.IsTextPatternAvailableProperty, "IsTextPatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsTogglePatternAvailableProperty == AutomationElement.IsTogglePatternAvailableProperty, "IsTogglePatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsTransformPatternAvailableProperty == AutomationElement.IsTransformPatternAvailableProperty, "IsTransformPatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsValuePatternAvailableProperty == AutomationElement.IsValuePatternAvailableProperty, "IsValuePatternAvailableProperty");
+			Assert.IsTrue (AEIds.IsWindowPatternAvailableProperty == AutomationElement.IsWindowPatternAvailableProperty, "IsWindowPatternAvailableProperty");
+			Assert.IsTrue (AEIds.ItemStatusProperty == AutomationElement.ItemStatusProperty, "ItemStatusProperty");
+			Assert.IsTrue (AEIds.ItemTypeProperty == AutomationElement.ItemTypeProperty, "ItemTypeProperty");
+			Assert.IsTrue (AEIds.LabeledByProperty == AutomationElement.LabeledByProperty, "LabeledByProperty");
+			Assert.IsTrue (AEIds.LocalizedControlTypeProperty == AutomationElement.LocalizedControlTypeProperty, "LocalizedControlTypeProperty");
+			Assert.IsTrue (AEIds.NameProperty == AutomationElement.NameProperty, "NameProperty");
+			Assert.IsTrue (AEIds.NativeWindowHandleProperty == AutomationElement.NativeWindowHandleProperty, "NativeWindowHandleProperty");
+			Assert.IsTrue (AEIds.OrientationProperty == AutomationElement.OrientationProperty, "OrientationProperty");
+			Assert.IsTrue (AEIds.ProcessIdProperty == AutomationElement.ProcessIdProperty, "ProcessIdProperty");
+			Assert.IsTrue (AEIds.RuntimeIdProperty == AutomationElement.RuntimeIdProperty, "RuntimeIdProperty");
+
+			Assert.IsTrue (AEIds.AsyncContentLoadedEvent == AutomationElement.AsyncContentLoadedEvent, "AsyncContentLoadedEvent");
+			Assert.IsTrue (AEIds.AutomationFocusChangedEvent == AutomationElement.AutomationFocusChangedEvent, "AutomationFocusChangedEvent");
+			Assert.IsTrue (AEIds.AutomationPropertyChangedEvent == AutomationElement.AutomationPropertyChangedEvent, "AutomationPropertyChangedEvent");
+			Assert.IsTrue (AEIds.LayoutInvalidatedEvent == AutomationElement.LayoutInvalidatedEvent, "LayoutInvalidatedEvent");
+			Assert.IsTrue (AEIds.MenuClosedEvent == AutomationElement.MenuClosedEvent, "MenuClosedEvent");
+			Assert.IsTrue (AEIds.MenuOpenedEvent == AutomationElement.MenuOpenedEvent, "MenuOpenedEvent");
+			Assert.IsTrue (AEIds.StructureChangedEvent == AutomationElement.StructureChangedEvent, "StructureChangedEvent");
+			Assert.IsTrue (AEIds.ToolTipClosedEvent == AutomationElement.ToolTipClosedEvent, "ToolTipClosedEvent");
+			Assert.IsTrue (AEIds.ToolTipOpenedEvent == AutomationElement.ToolTipOpenedEvent, "ToolTipOpenedEvent");
+
+			Assert.IsTrue (AEIds.NotSupported == AutomationElement.NotSupported, "NotSupported");
+		}
+
+		[Test]
+		public void RootElementTest ()
+		{
+			Assert.AreEqual (String.Empty,
+			                 AutomationElement.RootElement.Current.AcceleratorKey,
+			                 "AcceleratorKey");
+			Assert.AreEqual (String.Empty,
+			                 AutomationElement.RootElement.Current.AccessKey,
+			                 "AccessKey");
+			Assert.AreEqual (String.Empty,
+			                 AutomationElement.RootElement.Current.AutomationId,
+			                 "AutomationId");
+			//Assert.AreEqual (String.Empty, AutomationElement.RootElement.Current.BoundingRectangle, "BoundingRectangle"); // TODO
+			//Assert.AreEqual ("#32769", AutomationElement.RootElement.Current.ClassName, "ClassName"); // TODO
+			Assert.AreEqual (ControlType.Pane,
+			                 AutomationElement.RootElement.Current.ControlType,
+			                 "ControlType");
+			//Assert.AreEqual (String.Empty, AutomationElement.RootElement.Current.FrameworkId, "FrameworkId"); // TODO: "Win32"
+			Assert.IsFalse (AutomationElement.RootElement.Current.HasKeyboardFocus,
+			                "HasKeyboardFocus");
+			Assert.AreEqual (String.Empty,
+			                 AutomationElement.RootElement.Current.HelpText,
+			                 "HelpText");
+			Assert.IsTrue (AutomationElement.RootElement.Current.IsContentElement,
+			               "IsContentElement");
+			Assert.IsTrue (AutomationElement.RootElement.Current.IsControlElement,
+			               "IsControlElement");
+			Assert.IsTrue (AutomationElement.RootElement.Current.IsEnabled,
+			               "IsEnabled");
+			Assert.IsFalse (AutomationElement.RootElement.Current.IsKeyboardFocusable,
+			                "IsKeyboardFocusable");
+			Assert.IsFalse (AutomationElement.RootElement.Current.IsOffscreen,
+			                "IsOffscreen");
+			Assert.IsFalse (AutomationElement.RootElement.Current.IsPassword,
+			                "IsPassword");
+			Assert.IsFalse (AutomationElement.RootElement.Current.IsRequiredForForm,
+			                "IsRequiredForForm");
+			Assert.AreEqual (String.Empty,
+			                 AutomationElement.RootElement.Current.ItemStatus,
+			                 "ItemStatus");
+			Assert.AreEqual (String.Empty,
+			                 AutomationElement.RootElement.Current.ItemType,
+			                 "ItemType");
+			Assert.IsNull (AutomationElement.RootElement.Current.LabeledBy,
+			               "LabeledBy");
+			Assert.AreEqual (ControlType.Pane.LocalizedControlType,
+			                 AutomationElement.RootElement.Current.LocalizedControlType,
+			                 "LocalizedControlType");
+			Assert.AreEqual (String.Empty,
+			                 AutomationElement.RootElement.Current.Name,
+			                 "Name");
+			//Assert.AreEqual (65552, AutomationElement.RootElement.Current.NativeWindowHandle, "NativeWindowHandle"); // TODO: Probably changes
+			Assert.AreEqual (OrientationType.None,
+			                 AutomationElement.RootElement.Current.Orientation,
+			                 "Orientation");
+			//Assert.AreEqual (-1, AutomationElement.RootElement.Current.ProcessId, "ProcessId"); // TODO: Probably changes
+			//Assert.AreEqual (new int [] {42, 65552}, AutomationElement.RootElement.GetRuntimeId (), "GetRuntimeId"); // TODO: Probably changes
+			Assert.IsNull (TreeWalker.RawViewWalker.GetParent (AutomationElement.RootElement),
+			               "GetParent");
+			Assert.IsNull (TreeWalker.RawViewWalker.GetNextSibling (AutomationElement.RootElement),
+			               "GetNextSibling");
+			Assert.IsNull (TreeWalker.RawViewWalker.GetPreviousSibling (AutomationElement.RootElement),
+			               "GetPreviousSibling");
+			VerifyPatterns (AutomationElement.RootElement);
+		}
+
+		[Test]
+		public void PatternsTest ()
+		{
+			VerifyPatterns (button1Element,
+				InvokePatternIdentifiers.Pattern);
+
+			VerifyPatterns (checkBox1Element,
+				TogglePatternIdentifiers.Pattern);
+
+			object pattern;
+			Assert.IsFalse (numericUpDown1Element.TryGetCurrentPattern (InvokePatternIdentifiers.Pattern, out pattern),
+				"NumericUpDown should not support Invoke");
+		}
+
+		[Test]
+		public void CurrentTest ()
+		{
+			var current = label1Element.Current;
+			Assert.AreEqual ("label1",
+				current.Name,
+				"check label1's original text");
+			InvokePattern pattern = (InvokePattern) button1Element.GetCurrentPattern (InvokePattern.Pattern);
+			pattern.Invoke ();
+			Thread.Sleep (500);
+			Assert.AreEqual ("button1_click",
+				current.Name,
+				"label1's text is modified after button1 is clicked");
+		}
+
+		[Test]
+		public void FromHandleTest ()
+		{
+			AutomationElement [] elements = { testFormElement, button1Element, groupBox1Element };
+			foreach (var testElement in elements) {
+				int handle = testElement.Current.NativeWindowHandle;
+				var element = AutomationElement.FromHandle (new IntPtr (handle));
+				Assert.AreEqual (testElement, element,
+					String.Format ("{0}'s handle of {1} did not work in FromHandle",
+					testElement.Current.Name, handle));
+			}
+
+			var firstTreeItemElement = treeView1Element.FindFirst (TreeScope.Children, Condition.TrueCondition);
+			int itemHandle = firstTreeItemElement.Current.NativeWindowHandle;
+			Assert.AreEqual (0, itemHandle);
+			IntPtr itemPtr = new IntPtr (itemHandle);
+
+			AssertRaises<ArgumentException> (
+				() => AutomationElement.FromHandle (itemPtr),
+				"passing in IntPtr.Zero");
+			AssertRaises<ArgumentException> (
+				() => AutomationElement.FromHandle ((IntPtr)null),
+				"passing in null");
+		}
+
+		[Test]
+		public void SupportedPropertiesTest ()
+		{
+			SupportedPropertiesTestInternal (testFormElement);
+			SupportedPropertiesTestInternal (checkBox1Element);
+			SupportedPropertiesTestInternal (groupBox1Element);
+			SupportedPropertiesTestInternal (numericUpDown1Element);
+			SupportedPropertiesTestInternal (textbox1Element);
+			SupportedPropertiesTestInternal (treeView1Element);
+			SupportedPropertiesTestInternal (listView1Element);
+		}
+
+		[Test]
+		public void Bug570621_Test ()
+		{
+			var firstDataItem = this.table1Element.FindFirst (TreeScope.Children, new PropertyCondition(
+				AEIds.ControlTypeProperty, ControlType.DataItem));
+			Assert.AreEqual (0, firstDataItem.Current.NativeWindowHandle);
+
+			Assert.AreEqual (table1Element,
+				AutomationElement.FromHandle (new IntPtr (table1Element.Current.NativeWindowHandle)));
+		}
+
+		[Test]
+		public void Bug571711_Test ()
+		{
+			var firstDataItem = this.table1Element.FindFirst (TreeScope.Children, new PropertyCondition(
+				AEIds.ControlTypeProperty, ControlType.DataItem));
+			//assert the following line won't fire any exception
+			firstDataItem.GetCurrentPropertyValue (ValuePattern.ValueProperty);
+		}
+
+		[Test]
+		public void Z_FromPointTest ()
+		{
+			AutomationElement element;
+			if (!Atspi) {
+				RunCommand ("MoveTo.Origin");
+				RunCommand ("bring form to front");
+				element = AutomationElement.FromPoint (new Point (30.0, 30.0));
+				Assert.AreEqual (element, testFormElement);
+			}
+
+			// TODO: uncomment below line after fixing Bug #489387
+			//AssertControlFromPoint (testFormElement, 2.0, 2.0);
+			AssertControlFromPoint (testFormElement, 30.0, 30.0);
+			AssertControlFromPoint (button1Element, 5.0, 5.0);
+			// TODO: uncomment below line after fixing Bug #489387
+			//AssertControlFromPoint (textbox1Element, 2.0, 2.0);
+			AssertControlFromPoint (textbox1Element, 5.0, 5.0);
+			AssertControlFromPoint (groupBox1Element, 5.0, 5.0);
+			// TODO: uncomment below line after fixing Bug #489387
+			//AssertControlFromPoint (listView1Element);
+
+			AssertNotControlFromPoint (testFormElement, 800.0, 800.0);
+			AssertNotControlFromPoint (testFormElement, -10.0, -10.0);
+			RunCommand ("hide form for 3 seconds");
+			Thread.Sleep (1000);
+			AssertNotControlFromPoint (testFormElement, 30.0, 30.0);
+//			//Wait for the form to show up again.
+			Thread.Sleep (3000);
+
+			//Accoding to Windows behavior, if we give a out-of-screen point,
+			//then the returned element shall be RootElement.
+			element = AutomationElement.FromPoint (new Point (999999.0, 999999.0));
+			Assert.AreEqual (element, AutomationElement.RootElement);
+			element = AutomationElement.FromPoint (new Point (-50.0, -50.0));
+			Assert.AreEqual (element, AutomationElement.RootElement);
+
+			// TODO: Test that FromPoint works properly with multiple gtk+ and winforms windows
+		}
+
+		#endregion
+
+		#region Private Methods
+
+		private void AssertControlFromPoint (AutomationElement target, double relX, double relY)
+		{
+			var rect = target.Current.BoundingRectangle;
+			var element = AutomationElement.FromPoint (new Point (rect.X + relX, rect.Y + relY));
+			bool isInTarget = false;
+			while (element != null && element != AutomationElement.RootElement) {
+				if (element == target) {
+					isInTarget = true;
+					break;
+				}
+				element = TreeWalker.RawViewWalker.GetParent (element);
+			}
+			Assert.IsTrue (isInTarget);
+		}
+
+		private void AssertNotControlFromPoint (AutomationElement target, double x, double y)
+		{
+			bool compare = false;
+			try {
+				var element = AutomationElement.FromPoint (new Point (x, y));
+				compare = (element == target);
+			} catch (ElementNotAvailableException) {
+			}
+			Assert.IsFalse (compare,
+				"The returned element of \"FromPoint\" is not the given element.");
+		}
+
+		private void VerifyCurrentPropertyValue (AutomationElement element, AutomationProperty property, object expectedTrue, object expectedFalse, object expectedDefault)
+		{
+			Assert.AreEqual (expectedTrue,
+				element.GetCurrentPropertyValue (property, true),
+				property.ProgrammaticName + " w/ true");
+			Assert.AreEqual (expectedFalse,
+				element.GetCurrentPropertyValue (property, false),
+				property.ProgrammaticName + " w/ false");
+			Assert.AreEqual (expectedDefault,
+				element.GetCurrentPropertyValue (property),
+				property.ProgrammaticName + " w/ default");
+		}
+
+		private void VerifyFindAll (AutomationElement root, TreeScope scope, Condition condition, AutomationElement [] expectedElementsArray)
+		{
+			AutomationElementCollection result = null;
+
+			List<AutomationElement> expectedElements = new List<AutomationElement> (expectedElementsArray);
+
+			result = root.FindAll (scope, condition);
+
+			// TODO: Uncomment when we support titlebar and its subelements (including min/max/close buttons)
+			//Assert.AreEqual (expectedElements.Count, result.Count, "Result count");
+			List<AutomationElement> resultList = new List<AutomationElement> ();
+			foreach (AutomationElement element in result) {
+				resultList.Add (element);
+				// TODO: Uncomment when Count assertion is supported (see above)
+				//Assert.IsTrue (expectedElements.Contains (element),
+				//        String.Format ("Did not expect element named '{0}' with RuntimeId{1}", element.Current.Name, element.GetRuntimeId ()));
+			}
+
+			foreach (var element in expectedElements)
+				Assert.IsTrue (resultList.Contains (element),
+					String.Format ("Did not find expected element named '{0}' with RuntimeId{1}", element.Current.Name, PrintRuntimeId (element.GetRuntimeId ())));
+		}
+
+		private void VerifyFindFirst (AutomationElement root, TreeScope scope, AutomationElement [] includedElements, AutomationElement [] excludedElements)
+		{
+			foreach (var element in includedElements) {
+				int [] runtimeId = element.GetRuntimeId ();
+				AutomationElement result = root.FindFirst (scope,
+					new PropertyCondition (AEIds.RuntimeIdProperty, runtimeId));
+				Assert.IsNotNull (result,
+					String.Format ("Expected element named '{0}' with RuntimeId {1}", element.Current.Name, PrintRuntimeId (runtimeId)));
+				Assert.AreEqual (element, result,
+					String.Format ("Expected element named '{0}' with RuntimeId {1}, got '{2}' with Id {3}", element.Current.Name, PrintRuntimeId (runtimeId), result.Current.Name, result.Current.AutomationId));
+			}
+			foreach (var element in excludedElements) {
+				int [] runtimeId = element.GetRuntimeId ();
+				AutomationElement result = root.FindFirst (scope,
+					new PropertyCondition (AEIds.RuntimeIdProperty, runtimeId));
+				Assert.IsNull (result,
+					String.Format ("Did not expect element named '{0}' with RuntimeId{1}", element.Current.Name, PrintRuntimeId (runtimeId)));
+			}
+		}
+
+		private void SupportedPropertiesTestInternal (AutomationElement element)
+		{
+			var supportedProperties = element.GetSupportedProperties ();
+			foreach (AutomationPattern pattern in element.GetSupportedPatterns ()) {
+				foreach (var prop in GetPatternProperties (pattern)) {
+					Assert.IsTrue (supportedProperties.Contains (prop),
+						string.Format ("[{0}] {1} shall be supported since {2} pattern is supported",
+							element.Current.Name,
+							prop.ProgrammaticName,
+							At.PatternName (pattern)));
+				}
+			}
+			foreach (var prop in supportedProperties) {
+				Assert.AreNotEqual (AutomationElement.NotSupported,
+					element.GetCurrentPropertyValue (prop, true),
+					string.Format ("[{0}] {1} shall be supported since it's in SupportedProperties",
+						element.Current.Name,
+						prop.ProgrammaticName));
+			}
+		}
+		#endregion
+	}
+}
diff --git a/UIAutomationClientTests/UIAutomationClientTests/AutomationEventTest.cs b/UIAutomationClientTests/UIAutomationClientTests/AutomationEventTest.cs
new file mode 100644
index 0000000..ddeeb08
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/AutomationEventTest.cs
@@ -0,0 +1,318 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Matt Guo <matt at mattguo.com>
+// 
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using System.Windows.Automation;
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+using At = System.Windows.Automation.Automation;
+using SW = System.Windows;
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace MonoTests.System.Windows.Automation
+{
+	[TestFixture]
+	public class AutomationEventTest : BaseTest
+	{
+		[Test]
+		public void ArgumentExceptionTest ()
+		{
+			Action action = () => {
+				At.AddAutomationEventHandler (InvokePattern.InvokedEvent,
+					null, TreeScope.Element, (o, e) => {});
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as element to AddAutomationEventHandler");
+
+			action = () => {
+				At.AddAutomationPropertyChangedEventHandler (
+					null, TreeScope.Element, (o, e) => {}, AEIds.NameProperty);
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as element to AddAutomationPropertyChangedEventHandler");
+
+			action = () => {
+				At.AddStructureChangedEventHandler (
+					null, TreeScope.Element, (o, e) => {});
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as element to AddStructureChangedEventHandler");
+
+			action = () => {
+				At.AddAutomationEventHandler (InvokePattern.InvokedEvent,
+					button1Element, TreeScope.Element, null);
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as handler to AddAutomationEventHandler");
+
+			action = () => {
+				At.AddAutomationPropertyChangedEventHandler (
+					button1Element, TreeScope.Element, null, AEIds.NameProperty);
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as handler to AddAutomationPropertyChangedEventHandler");
+
+			action = () => {
+				At.AddStructureChangedEventHandler (
+					button1Element, TreeScope.Element, null);
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as handler to AddStructureChangedEventHandler");
+
+			action = () => {
+				At.AddAutomationFocusChangedEventHandler (null);
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as handler to AddAutomationFocusChangedEventHandler");
+
+			action = () => {
+				At.RemoveAutomationEventHandler (InvokePattern.InvokedEvent,
+					null, (o, e) => {});
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as element to RemoveAutomationEventHandler");
+
+			action = () => {
+				At.RemoveAutomationPropertyChangedEventHandler (
+					null, (o, e) => {});
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as element to RemoveAutomationPropertyChangedEventHandler");
+
+			action = () => {
+				At.RemoveStructureChangedEventHandler (
+					null, (o, e) => {});
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as element to RemoveStructureChangedEventHandler");
+
+			action = () => {
+				At.RemoveAutomationEventHandler (InvokePattern.InvokedEvent,
+					button1Element, null);
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as handler to RemoveAutomationEventHandler");
+
+			action = () => {
+				At.RemoveAutomationPropertyChangedEventHandler (
+					button1Element, null);
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as handler to RemoveAutomationPropertyChangedEventHandler");
+
+			action = () => {
+				At.RemoveStructureChangedEventHandler (
+					button1Element, null);
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as handler to RemoveStructureChangedEventHandler");
+
+			action = () => {
+				At.RemoveAutomationFocusChangedEventHandler (null);
+			};
+			AssertRaises<ArgumentNullException>(action,
+				"Pass null as handler to RemoveAutomationFocusChangedEventHandler");
+
+			//Assert removing a non-existent handler won't fire any exception
+			At.RemoveAutomationEventHandler (InvokePattern.InvokedEvent,
+				button1Element, (o, e) => { Console.Write("nop"); } );
+			At.RemoveAutomationPropertyChangedEventHandler (
+				button1Element, (o, e) => { Console.Write("nop"); } );
+			At.RemoveStructureChangedEventHandler (
+				button1Element, (o, e) => { Console.Write("nop"); } );
+			At.RemoveAutomationFocusChangedEventHandler (
+				(o, e) => { Console.Write("nop"); } );
+
+		}
+
+		[Test]
+		public void StructureEventTest ()
+		{
+			List<AutomationElement> elementEventSenders = new List<AutomationElement> ();
+			List<StructureChangeType> elementEventChangeTypes = new List<StructureChangeType> ();
+			List<AutomationElement> childrenEventSenders = new List<AutomationElement> ();
+			List<StructureChangeType> childrenEventChangeTypes = new List<StructureChangeType> ();
+			StructureChangedEventHandler elementHandler = delegate (object sender, StructureChangedEventArgs args) {
+				elementEventSenders.Add (sender as AutomationElement);
+				elementEventChangeTypes.Add (args.StructureChangeType);
+			};
+			At.AddStructureChangedEventHandler(panel1Element, TreeScope.Element, elementHandler);
+			StructureChangedEventHandler childrenHandler = delegate (object sender, StructureChangedEventArgs args) {
+				childrenEventSenders.Add (sender as AutomationElement);
+				childrenEventChangeTypes.Add (args.StructureChangeType);
+			};
+			At.AddStructureChangedEventHandler(panel1Element, TreeScope.Children, childrenHandler);
+			InvokePattern addAction = (InvokePattern) btnAddTextboxElement.GetCurrentPattern (InvokePattern.Pattern);
+			InvokePattern removeAction = (InvokePattern) btnRemoveTextboxElement.GetCurrentPattern (InvokePattern.Pattern);
+			addAction.Invoke ();
+			Thread.Sleep (1000);
+			Assert.AreEqual (1, elementEventSenders.Count, "Check event count");
+			Assert.AreEqual (panel1Element, elementEventSenders [0], "Check ChildrenInvalidated event sender");
+			Assert.AreEqual (StructureChangeType.ChildrenInvalidated,
+			                 elementEventChangeTypes [0], "Check ChildrenInvalidated event type");
+			Assert.AreEqual (1, childrenEventSenders.Count, "Check event count");
+			Assert.AreEqual (StructureChangeType.ChildAdded,
+			                 childrenEventChangeTypes [0], "Check ChildAdded event type");
+			removeAction.Invoke ();
+			Thread.Sleep (1000);
+			Assert.AreEqual (3, elementEventSenders.Count, "Check event count");
+			Assert.AreEqual (panel1Element, elementEventSenders [1], "Check event sender");
+			Assert.AreEqual (panel1Element, elementEventSenders [2], "Check event sender");
+			Assert.IsTrue ((elementEventChangeTypes [1] == StructureChangeType.ChildRemoved
+			               && elementEventChangeTypes [2] == StructureChangeType.ChildrenInvalidated) ||
+			               (elementEventChangeTypes [1] == StructureChangeType.ChildrenInvalidated
+			               && elementEventChangeTypes [2] == StructureChangeType.ChildRemoved),
+			               "Check event type");
+			addAction.Invoke ();
+			Thread.Sleep (1000);
+			Assert.AreEqual (4, elementEventSenders.Count, "Check event count");
+			Assert.AreEqual (panel1Element, elementEventSenders [3], "Check ChildrenInvalidated event sender");
+			Assert.AreEqual (StructureChangeType.ChildrenInvalidated,
+			                 elementEventChangeTypes [3], "Check ChildrenInvalidated event type");
+			Assert.AreEqual (2, childrenEventSenders.Count, "Check event count");
+			Assert.AreEqual (StructureChangeType.ChildAdded,
+			                 childrenEventChangeTypes [1], "Check ChildAdded event type");
+
+			At.RemoveStructureChangedEventHandler (panel1Element, elementHandler);
+			At.RemoveStructureChangedEventHandler (panel1Element, childrenHandler);
+			addAction.Invoke ();
+			Thread.Sleep (1000);
+			Assert.AreEqual (4, elementEventSenders.Count, "Element event count didn't change");
+			Assert.AreEqual (2, childrenEventSenders.Count, "Children event count didn't change");
+		}
+
+		/*
+		 * From MSDN:
+		 "Not all property changes raise events; that is entirely up to the implementation of the UI Automation provider
+		  for the element. For example, the standard proxy providers for list boxes do not raise an event when the
+		   SelectionProperty changes. In this case, the application instead must listen for an ElementSelectedEvent."
+		 * */
+		[Test]
+		public void SelectionPropertyChangedEventTest ()
+		{
+			int propertyEventCount = 0;
+			int selectionEventCount = 0;
+			AutomationPropertyChangedEventHandler propertyHandler =
+				(o, e) => { propertyEventCount++; };
+			AutomationEventHandler selectionEventHandler =
+				(o, e) => { selectionEventCount++; };
+
+			var childElement = treeView1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.TreeItem));
+
+			At.AddAutomationPropertyChangedEventHandler (treeView1Element, TreeScope.Subtree,
+				propertyHandler, SelectionPattern.SelectionProperty);
+			At.AddAutomationEventHandler (SelectionItemPattern.ElementSelectedEvent,
+				childElement, TreeScope.Element, selectionEventHandler);
+
+			var pattern = (SelectionPattern)
+				treeView1Element.GetCurrentPattern (SelectionPatternIdentifiers.Pattern);
+			Assert.IsNotNull (pattern, "selectionPattern should not be null");
+			var current = pattern.Current;
+			AutomationElement [] selection = current.GetSelection ();
+			Assert.AreEqual (0, selection.Length, "Selection length");
+
+			var selectionItemPattern = (SelectionItemPattern)
+				childElement.GetCurrentPattern (SelectionItemPatternIdentifiers.Pattern);
+			selectionItemPattern.Select ();
+			Thread.Sleep (1000);
+
+			selection = current.GetSelection ();
+			Assert.AreEqual (1, selection.Length, "Selection length");
+			Assert.AreEqual (0, propertyEventCount, "# of SelectionProperty changed event");
+			Assert.AreEqual (1, selectionEventCount, "# of selection event");
+		}
+
+		[Test]
+		public void BoundingRectanglePropertyChangedEventTest ()
+		{
+			int eventCount = 0;
+			object newValue = null;
+			AutomationPropertyChangedEventHandler propertyHandler = (o, e) => {
+				eventCount++;
+				newValue = e.NewValue;
+			};
+			At.AddAutomationPropertyChangedEventHandler (testFormElement, TreeScope.Element,
+				propertyHandler, AEIds.BoundingRectangleProperty);
+			RunCommand ("change form size 800x600");
+			Thread.Sleep (1000);
+			Assert.AreEqual (1, eventCount);
+			SW.Rect rect = (SW.Rect) newValue;
+			Assert.AreEqual (800, rect.Width, "rect.Width");
+			Assert.AreEqual (600, rect.Height, "rect.Height");
+		}
+
+		[Test]
+		public void ControlTypePropertyChangedEventTest ()
+		{
+			int eventCount = 0;
+			AutomationPropertyChangedEventHandler propertyHandler = 
+				(o, e) => { eventCount++; };
+
+			// textBox3's ControlType will change from "Document" to "Edit" if we set Multiline = false
+			// but on Windows we don't have corresponding property changed event.
+			At.AddAutomationPropertyChangedEventHandler (textbox3Element, TreeScope.Element,
+				propertyHandler, AEIds.ControlTypeProperty);
+			var ct = textbox3Element.Current.ControlType;
+			Assert.AreEqual (ControlType.Document, ct, ct.ProgrammaticName);
+
+			RunCommand ("textBox3 singleline");
+			Thread.Sleep (500);
+
+			ct = textbox3Element.Current.ControlType;
+			Assert.AreEqual (ControlType.Document, ct, ct.ProgrammaticName);
+			textbox3Element = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty, "textBox3"));
+
+			ct = textbox3Element.Current.ControlType;
+			Assert.AreEqual (ControlType.Edit, ct, ct.ProgrammaticName);
+			Assert.AreEqual (0, eventCount);
+
+			// listView1's ControlType will change from "DataGrid" to "List" if we set View = View.Tile
+			// but on Windows we don't have corresponding property changed event.
+			At.AddAutomationPropertyChangedEventHandler (listView1Element, TreeScope.Element,
+				propertyHandler, AEIds.ControlTypeProperty);
+			ct = listView1Element.Current.ControlType;
+			Assert.AreEqual (ControlType.DataGrid, ct, ct.ProgrammaticName);
+
+			RunCommand ("change list view mode tile");
+			Thread.Sleep (500);
+
+			ct = listView1Element.Current.ControlType;
+			Assert.AreEqual (ControlType.DataGrid, ct, ct.ProgrammaticName);
+			listView1Element = testFormElement.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty, "listView1"));
+
+			ct = listView1Element.Current.ControlType;
+			Assert.AreEqual (ControlType.List, ct, ct.ProgrammaticName);
+			Assert.AreEqual (0, eventCount);
+		}
+	}
+}
+
diff --git a/UIAutomationClientTests/UIAutomationClientTests/AutomationTest.cs b/UIAutomationClientTests/UIAutomationClientTests/AutomationTest.cs
new file mode 100644
index 0000000..8178c2b
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/AutomationTest.cs
@@ -0,0 +1,860 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using System.Windows;
+using SWA = System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+
+using NUnit.Framework;
+
+namespace MonoTests.System.Windows.Automation
+{
+	[TestFixture]
+	public class AutomationTest
+	{
+		List<Process> potentiallyRunningProcesses =
+			new List<Process> ();
+
+		[TearDown]
+		public void TearDown ()
+		{
+			foreach (var p in potentiallyRunningProcesses)
+				if (!p.HasExited)
+					p.Kill ();
+			potentiallyRunningProcesses.Clear ();
+		}
+
+		// TODO: Test event handling methods
+		[Test]
+		public void ComparerRuntimeIdsTest ()
+		{
+			int [] idSet1a = new int [] { 1, 2 };
+			int [] idSet1b = new int [] { 1, 2 };
+			int [] idSet2 = new int [] { 1 };
+			int [] idSet3 = new int [] { };
+			int [] idSet4 = new int [] { 2, 1 };
+
+			Assert.IsTrue (SWA.Automation.Compare (idSet1a, idSet1a),
+				"Identity");
+			Assert.IsTrue (SWA.Automation.Compare (idSet1a, idSet1b),
+				"Identity");
+			Assert.IsFalse (SWA.Automation.Compare (idSet1a, idSet4),
+				"Order matters");
+			Assert.IsFalse (SWA.Automation.Compare (idSet1a, idSet2),
+				"Different lengths");
+			Assert.IsFalse (SWA.Automation.Compare (idSet1a, idSet3),
+				"Compare non-empty with empty");
+			Assert.IsTrue (SWA.Automation.Compare (idSet3, idSet3),
+				"Compare empty with empty");
+
+			bool argumentNullRaised = false;
+			try {
+				SWA.Automation.Compare (idSet1a, null);
+			} catch (ArgumentNullException) {
+				argumentNullRaised = true;
+			}
+			Assert.IsTrue (argumentNullRaised,
+				"Expected ArgumentNullException");
+		}
+
+		[Test]
+		public void CompareAutomationElementsTest ()
+		{
+			Process p = BaseTest.StartApplication (@"SampleForm.exe",
+				String.Empty);
+			try {
+				Thread.Sleep (1000);
+
+				SWA.AutomationElement testFormElement = SWA.AutomationElement.RootElement.FindFirst (SWA.TreeScope.Children,
+					new SWA.PropertyCondition (AEIds.ProcessIdProperty,
+						p.Id));
+				Assert.IsNotNull (testFormElement,
+					"window");
+
+				SWA.AutomationElement groupBox1Element = testFormElement.FindFirst (SWA.TreeScope.Children,
+					new SWA.PropertyCondition (AEIds.ControlTypeProperty,
+						SWA.ControlType.Group));
+				Assert.IsNotNull (groupBox1Element,
+					"groupBox1");
+
+				Assert.IsTrue (SWA.Automation.Compare (testFormElement, testFormElement),
+					"Identity");
+
+				SWA.AutomationElement testFormElement2 = SWA.AutomationElement.RootElement.FindFirst (SWA.TreeScope.Children,
+					new SWA.PropertyCondition (AEIds.ProcessIdProperty,
+						p.Id));
+
+				Assert.IsTrue (SWA.Automation.Compare (testFormElement, testFormElement2),
+					"Comparing different instances representing the same element");
+
+				Assert.IsFalse (SWA.Automation.Compare (testFormElement, groupBox1Element),
+					"Comparing different elements");
+
+				bool argumentNullRaised = false;
+				try {
+					SWA.Automation.Compare (testFormElement, null);
+				} catch (ArgumentNullException) {
+					argumentNullRaised = true;
+				}
+				Assert.IsTrue (argumentNullRaised,
+					"Expected ArgumentNullException");
+			} finally {
+				p.Kill ();
+			}
+		}
+
+		[Test]
+		public void PatternNameTest ()
+		{
+			Dictionary<SWA.AutomationPattern, string> expectedPatternNames =
+				new Dictionary<SWA.AutomationPattern, string> ();
+
+			// Load for all patterns
+			expectedPatternNames [SWA.DockPatternIdentifiers.Pattern] =
+				"Dock";
+			expectedPatternNames [SWA.ExpandCollapsePatternIdentifiers.Pattern] =
+				"ExpandCollapse";
+			expectedPatternNames [SWA.GridItemPatternIdentifiers.Pattern] =
+				"GridItem";
+			expectedPatternNames [SWA.GridPatternIdentifiers.Pattern] =
+				"Grid";
+			expectedPatternNames [SWA.InvokePatternIdentifiers.Pattern] =
+				"Invoke";
+			expectedPatternNames [SWA.MultipleViewPatternIdentifiers.Pattern] =
+				"MultipleView";
+			expectedPatternNames [SWA.RangeValuePatternIdentifiers.Pattern] =
+				"RangeValue";
+			expectedPatternNames [SWA.ScrollItemPatternIdentifiers.Pattern] =
+				"ScrollItem";
+			expectedPatternNames [SWA.ScrollPatternIdentifiers.Pattern] =
+				"Scroll";
+			expectedPatternNames [SWA.SelectionItemPatternIdentifiers.Pattern] =
+				"SelectionItem";
+			expectedPatternNames [SWA.SelectionPatternIdentifiers.Pattern] =
+				"Selection";
+			expectedPatternNames [SWA.TableItemPatternIdentifiers.Pattern] =
+				"TableItem";
+			expectedPatternNames [SWA.TablePatternIdentifiers.Pattern] =
+				"Table";
+			expectedPatternNames [SWA.TextPatternIdentifiers.Pattern] =
+				"Text";
+			expectedPatternNames [SWA.TogglePatternIdentifiers.Pattern] =
+				"Toggle";
+			expectedPatternNames [SWA.TransformPatternIdentifiers.Pattern] =
+				"Transform";
+			expectedPatternNames [SWA.ValuePatternIdentifiers.Pattern] =
+				"Value";
+			expectedPatternNames [SWA.WindowPatternIdentifiers.Pattern] =
+				"Window";
+
+			foreach (var pair in expectedPatternNames)
+				Assert.AreEqual (pair.Value,
+					SWA.Automation.PatternName (pair.Key),
+					pair.Key.ProgrammaticName);
+
+			bool argumentNullRaised = false;
+			try {
+				Assert.IsNull (SWA.Automation.PatternName (null));
+			} catch (ArgumentNullException) {
+				argumentNullRaised = true;
+			}
+			Assert.IsTrue (argumentNullRaised,
+				"Expected ArgumentNullException");
+		}
+
+		[Test]
+		public void PropertyNameTest ()
+		{
+			Dictionary<SWA.AutomationProperty, string> expectedPropertyNames =
+				new Dictionary<SWA.AutomationProperty, string> ();
+
+			//Load for everything in AEIds
+			expectedPropertyNames [AEIds.AcceleratorKeyProperty] =
+				"AcceleratorKey";
+			expectedPropertyNames [AEIds.AccessKeyProperty] =
+				"AccessKey";
+			expectedPropertyNames [AEIds.AutomationIdProperty] =
+				"AutomationId";
+			expectedPropertyNames [AEIds.BoundingRectangleProperty] =
+				"BoundingRectangle";
+			expectedPropertyNames [AEIds.ClassNameProperty] =
+				"ClassName";
+			expectedPropertyNames [AEIds.ClickablePointProperty] =
+				"ClickablePoint";
+			expectedPropertyNames [AEIds.ControlTypeProperty] =
+				"ControlType";
+			expectedPropertyNames [AEIds.CultureProperty] =
+				"Culture";
+			expectedPropertyNames [AEIds.FrameworkIdProperty] =
+				"FrameworkId";
+			expectedPropertyNames [AEIds.HasKeyboardFocusProperty] =
+				"HasKeyboardFocus";
+			expectedPropertyNames [AEIds.HelpTextProperty] =
+				"HelpText";
+			expectedPropertyNames [AEIds.IsContentElementProperty] =
+				"IsContentElement";
+			expectedPropertyNames [AEIds.IsControlElementProperty] =
+				"IsControlElement";
+			expectedPropertyNames [AEIds.IsDockPatternAvailableProperty] =
+				"IsDockPatternAvailable";
+			expectedPropertyNames [AEIds.IsEnabledProperty] =
+				"IsEnabled";
+			expectedPropertyNames [AEIds.IsExpandCollapsePatternAvailableProperty] =
+				"IsExpandCollapsePatternAvailable";
+			expectedPropertyNames [AEIds.IsGridItemPatternAvailableProperty] =
+				"IsGridItemPatternAvailable";
+			expectedPropertyNames [AEIds.IsGridPatternAvailableProperty] =
+				"IsGridPatternAvailable";
+			expectedPropertyNames [AEIds.IsInvokePatternAvailableProperty] =
+				"IsInvokePatternAvailable";
+			expectedPropertyNames [AEIds.IsKeyboardFocusableProperty] =
+				"IsKeyboardFocusable";
+			expectedPropertyNames [AEIds.IsMultipleViewPatternAvailableProperty] =
+				"IsMultipleViewPatternAvailable";
+			expectedPropertyNames [AEIds.IsOffscreenProperty] =
+				"IsOffscreen";
+			expectedPropertyNames [AEIds.IsPasswordProperty] =
+				"IsPassword";
+			expectedPropertyNames [AEIds.IsRangeValuePatternAvailableProperty] =
+				"IsRangeValuePatternAvailable";
+			expectedPropertyNames [AEIds.IsRequiredForFormProperty] =
+				"IsRequiredForForm";
+			expectedPropertyNames [AEIds.IsScrollItemPatternAvailableProperty] =
+				"IsScrollItemPatternAvailable";
+			expectedPropertyNames [AEIds.IsScrollPatternAvailableProperty] =
+				"IsScrollPatternAvailable";
+			expectedPropertyNames [AEIds.IsSelectionItemPatternAvailableProperty] =
+				"IsSelectionItemPatternAvailable";
+			expectedPropertyNames [AEIds.IsSelectionPatternAvailableProperty] =
+				"IsSelectionPatternAvailable";
+			expectedPropertyNames [AEIds.IsTableItemPatternAvailableProperty] =
+				"IsTableItemPatternAvailable";
+			expectedPropertyNames [AEIds.IsTablePatternAvailableProperty] =
+				"IsTablePatternAvailable";
+			expectedPropertyNames [AEIds.IsTextPatternAvailableProperty] =
+				"IsTextPatternAvailable";
+			expectedPropertyNames [AEIds.IsTogglePatternAvailableProperty] =
+				"IsTogglePatternAvailable";
+			expectedPropertyNames [AEIds.IsTransformPatternAvailableProperty] =
+				"IsTransformPatternAvailable";
+			expectedPropertyNames [AEIds.IsValuePatternAvailableProperty] =
+				"IsValuePatternAvailable";
+			expectedPropertyNames [AEIds.IsWindowPatternAvailableProperty] =
+				"IsWindowPatternAvailable";
+			expectedPropertyNames [AEIds.ItemStatusProperty] =
+				"ItemStatus";
+			expectedPropertyNames [AEIds.ItemTypeProperty] =
+				"ItemType";
+			expectedPropertyNames [AEIds.LabeledByProperty] =
+				"LabeledBy";
+			expectedPropertyNames [AEIds.LocalizedControlTypeProperty] =
+				"LocalizedControlType";
+			expectedPropertyNames [AEIds.NameProperty] =
+				"Name";
+			expectedPropertyNames [AEIds.NativeWindowHandleProperty] =
+				"NativeWindowHandle";
+			expectedPropertyNames [AEIds.OrientationProperty] =
+				"Orientation";
+			expectedPropertyNames [AEIds.ProcessIdProperty] =
+				"ProcessId";
+			expectedPropertyNames [AEIds.RuntimeIdProperty] =
+				"RuntimeId";
+
+			// Load everything for *PatternIdentifiers
+			expectedPropertyNames [SWA.DockPatternIdentifiers.DockPositionProperty] =
+				"DockPosition";
+			expectedPropertyNames [SWA.ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty] =
+				"ExpandCollapseState";
+			expectedPropertyNames [SWA.GridItemPatternIdentifiers.ColumnProperty] =
+				"Column";
+			expectedPropertyNames [SWA.GridItemPatternIdentifiers.ColumnSpanProperty] =
+				"ColumnSpan";
+			expectedPropertyNames [SWA.GridItemPatternIdentifiers.ContainingGridProperty] =
+				"ContainingGrid";
+			expectedPropertyNames [SWA.GridItemPatternIdentifiers.RowProperty] =
+				"Row";
+			expectedPropertyNames [SWA.GridItemPatternIdentifiers.RowSpanProperty] =
+				"RowSpan";
+			expectedPropertyNames [SWA.GridPatternIdentifiers.ColumnCountProperty] =
+				"ColumnCount";
+			expectedPropertyNames [SWA.GridPatternIdentifiers.RowCountProperty] =
+				"RowCount";
+			expectedPropertyNames [SWA.MultipleViewPatternIdentifiers.CurrentViewProperty] =
+				"CurrentView";
+			expectedPropertyNames [SWA.MultipleViewPatternIdentifiers.SupportedViewsProperty] =
+				"SupportedViews";
+			expectedPropertyNames [SWA.RangeValuePatternIdentifiers.IsReadOnlyProperty] =
+				"IsReadOnly";
+			expectedPropertyNames [SWA.RangeValuePatternIdentifiers.LargeChangeProperty] =
+				"LargeChange";
+			expectedPropertyNames [SWA.RangeValuePatternIdentifiers.MaximumProperty] =
+				"Maximum";
+			expectedPropertyNames [SWA.RangeValuePatternIdentifiers.MinimumProperty] =
+				"Minimum";
+			expectedPropertyNames [SWA.RangeValuePatternIdentifiers.SmallChangeProperty] =
+				"SmallChange";
+			expectedPropertyNames [SWA.RangeValuePatternIdentifiers.ValueProperty] =
+				"Value";
+			expectedPropertyNames [SWA.ScrollPatternIdentifiers.HorizontallyScrollableProperty] =
+				"HorizontallyScrollable";
+			expectedPropertyNames [SWA.ScrollPatternIdentifiers.HorizontalScrollPercentProperty] =
+				"HorizontalScrollPercent";
+			expectedPropertyNames [SWA.ScrollPatternIdentifiers.HorizontalViewSizeProperty] =
+				"HorizontalViewSize";
+			expectedPropertyNames [SWA.ScrollPatternIdentifiers.VerticallyScrollableProperty] =
+				"VerticallyScrollable";
+			expectedPropertyNames [SWA.ScrollPatternIdentifiers.VerticalScrollPercentProperty] =
+				"VerticalScrollPercent";
+			expectedPropertyNames [SWA.ScrollPatternIdentifiers.VerticalViewSizeProperty] =
+				"VerticalViewSize";
+			expectedPropertyNames [SWA.SelectionItemPatternIdentifiers.IsSelectedProperty] =
+				"IsSelected";
+			expectedPropertyNames [SWA.SelectionItemPatternIdentifiers.SelectionContainerProperty] =
+				"SelectionContainer";
+			expectedPropertyNames [SWA.SelectionPatternIdentifiers.CanSelectMultipleProperty] =
+				"CanSelectMultiple";
+			expectedPropertyNames [SWA.SelectionPatternIdentifiers.IsSelectionRequiredProperty] =
+				"IsSelectionRequired";
+			expectedPropertyNames [SWA.SelectionPatternIdentifiers.SelectionProperty] =
+				"Selection";
+			expectedPropertyNames [SWA.TableItemPatternIdentifiers.ColumnHeaderItemsProperty] =
+				"ColumnHeaderItems";
+			expectedPropertyNames [SWA.TableItemPatternIdentifiers.RowHeaderItemsProperty] =
+				"RowHeaderItems";
+			expectedPropertyNames [SWA.TablePatternIdentifiers.ColumnHeadersProperty] =
+				"ColumnHeaders";
+			expectedPropertyNames [SWA.TablePatternIdentifiers.RowHeadersProperty] =
+				"RowHeaders";
+			expectedPropertyNames [SWA.TablePatternIdentifiers.RowOrColumnMajorProperty] =
+				"RowOrColumnMajor";
+			expectedPropertyNames [SWA.TogglePatternIdentifiers.ToggleStateProperty] =
+				"ToggleState";
+			expectedPropertyNames [SWA.TransformPatternIdentifiers.CanMoveProperty] =
+				"CanMove";
+			expectedPropertyNames [SWA.TransformPatternIdentifiers.CanResizeProperty] =
+				"CanResize";
+			expectedPropertyNames [SWA.TransformPatternIdentifiers.CanRotateProperty] =
+				"CanRotate";
+			expectedPropertyNames [SWA.ValuePatternIdentifiers.IsReadOnlyProperty] =
+				"IsReadOnly";
+			expectedPropertyNames [SWA.ValuePatternIdentifiers.ValueProperty] =
+				"Value";
+			expectedPropertyNames [SWA.WindowPatternIdentifiers.CanMaximizeProperty] =
+				"CanMaximize";
+			expectedPropertyNames [SWA.WindowPatternIdentifiers.CanMinimizeProperty] =
+				"CanMinimize";
+			expectedPropertyNames [SWA.WindowPatternIdentifiers.IsModalProperty] =
+				"IsModal";
+			expectedPropertyNames [SWA.WindowPatternIdentifiers.IsTopmostProperty] =
+				"IsTopmost";
+			expectedPropertyNames [SWA.WindowPatternIdentifiers.WindowInteractionStateProperty] =
+				"WindowInteractionState";
+			expectedPropertyNames [SWA.WindowPatternIdentifiers.WindowVisualStateProperty] =
+				"WindowVisualState";
+
+			foreach (var pair in expectedPropertyNames)
+				Assert.AreEqual (pair.Value,
+					SWA.Automation.PropertyName (pair.Key),
+					pair.Key.ProgrammaticName);
+
+			bool argumentNullRaised = false;
+			try {
+				Assert.IsNull (SWA.Automation.PropertyName (null));
+			} catch (ArgumentNullException) {
+				argumentNullRaised = true;
+			}
+			Assert.IsTrue (argumentNullRaised,
+				"Expected ArgumentNullException");
+		}
+
+		[Test]
+		public void ContentViewConditionTest ()
+		{
+			SWA.Condition contentViewCond = SWA.Automation.ContentViewCondition;
+			Assert.IsNotNull (contentViewCond, "ContentViewCondition");
+
+			SWA.PropertyCondition contentViewPropCond = contentViewCond as SWA.PropertyCondition;
+			Assert.IsNull (contentViewPropCond, "ContentViewCondition is not a PropertyCondition");
+
+			SWA.AndCondition contentViewAndCond = contentViewCond as SWA.AndCondition; Assert.IsNull (contentViewPropCond, "ContentViewCondition is not a PropertyCondition");
+			Assert.IsNull (contentViewAndCond, "ContentViewCondition is not a AndCondition");
+
+			SWA.OrCondition contentViewOrCond = contentViewCond as SWA.OrCondition;
+			Assert.IsNull (contentViewOrCond, "ContentViewCondition is not a OrCondition");
+
+			SWA.NotCondition contentViewNotCond = contentViewCond as SWA.NotCondition;
+			Assert.IsNotNull (contentViewNotCond, "ContentViewCondition is a NotCondition");
+
+			SWA.Condition subCond = contentViewNotCond.Condition;
+			Assert.IsNotNull (subCond, "ContentViewCondition.Condition");
+
+			SWA.OrCondition subOrCond = subCond as SWA.OrCondition;
+			Assert.IsNotNull (subOrCond, "ContentViewCondition.Condition is a OrCondition");
+
+			SWA.Condition [] subSubConditions = subOrCond.GetConditions ();
+			Assert.AreEqual (2, subSubConditions.Length, "ContentViewCondition.Condition.GetConditions length");
+
+			SWA.PropertyCondition subSubPropertyCond1 = subSubConditions [0] as SWA.PropertyCondition;
+			Assert.IsNotNull (subSubPropertyCond1);
+			SWA.PropertyCondition subSubPropertyCond2 = subSubConditions [1] as SWA.PropertyCondition;
+			Assert.IsNotNull (subSubPropertyCond2);
+
+			Assert.AreEqual (AEIds.IsControlElementProperty,
+				subSubPropertyCond1.Property,
+				"subcondition1 Property");
+			Assert.AreEqual (false,
+				subSubPropertyCond1.Value,
+				"subcondition1 Value");
+			Assert.AreEqual (SWA.PropertyConditionFlags.None,
+				subSubPropertyCond1.Flags,
+				"subcondition1 Flags");
+
+			Assert.AreEqual (AEIds.IsContentElementProperty.ProgrammaticName,
+				subSubPropertyCond2.Property.ProgrammaticName,
+				"subcondition2 Property");
+			Assert.AreEqual (false,
+				subSubPropertyCond2.Value,
+				"subcondition2 Value");
+			Assert.AreEqual (SWA.PropertyConditionFlags.None,
+				subSubPropertyCond2.Flags,
+				"subcondition2 Flags");
+		}
+
+		[Test]
+		public void ControlViewConditionTest ()
+		{
+			SWA.Condition controlViewCond = SWA.Automation.ControlViewCondition;
+			Assert.IsNotNull (controlViewCond, "ControlViewCondition");
+
+			SWA.PropertyCondition controlViewPropCond = controlViewCond as SWA.PropertyCondition;
+			Assert.IsNull (controlViewPropCond, "ControlViewCondition is not a PropertyCondition");
+
+			SWA.AndCondition controlViewAndCond = controlViewCond as SWA.AndCondition;
+			Assert.IsNull (controlViewAndCond, "ControlViewCondition is not a AndCondition");
+
+			SWA.OrCondition controlViewOrCond = controlViewCond as SWA.OrCondition;
+			Assert.IsNull (controlViewOrCond, "ControlViewCondition is not a OrCondition");
+
+			SWA.NotCondition controlViewNotCond = controlViewCond as SWA.NotCondition;
+			Assert.IsNotNull (controlViewNotCond, "ControlViewCondition is a NotCondition");
+
+			SWA.Condition subCond = controlViewNotCond.Condition;
+			Assert.IsNotNull (subCond, "ControlViewCondition.Condition");
+
+			SWA.PropertyCondition subPropertyCond = subCond as SWA.PropertyCondition;
+			Assert.IsNotNull (subPropertyCond, "ControlViewCondition.Condition is a PropertyCondition");
+			Assert.AreEqual (AEIds.IsControlElementProperty,
+				subPropertyCond.Property,
+				"ControlViewCondition.Condition.Property");
+			Assert.AreEqual (false,
+				subPropertyCond.Value,
+				"ControlViewCondition.Condition.Value");
+			Assert.AreEqual (SWA.PropertyConditionFlags.None,
+				subPropertyCond.Flags,
+				"ControlViewCondition.Condition.Flags");
+		}
+
+		[Test]
+		public void RawViewConditionTest ()
+		{
+			SWA.Condition rawViewCond = SWA.Automation.RawViewCondition;
+			Assert.IsNotNull (rawViewCond, "RawViewCondition");
+
+			SWA.PropertyCondition rawViewPropCond = rawViewCond as SWA.PropertyCondition;
+			Assert.IsNull (rawViewPropCond, "RawViewCondition is not a PropertyCondition");
+
+			SWA.AndCondition rawViewAndCond = rawViewCond as SWA.AndCondition;
+			Assert.IsNull (rawViewAndCond, "RawViewCondition is not a AndCondition");
+
+			SWA.OrCondition rawViewOrCond = rawViewCond as SWA.OrCondition;
+			Assert.IsNull (rawViewOrCond, "RawViewCondition is not a OrCondition");
+
+			SWA.NotCondition rawViewNotCond = rawViewCond as SWA.NotCondition;
+			Assert.IsNull (rawViewNotCond, "RawViewCondition is not a NotCondition");
+		}
+
+		[Test]
+		public void PatternMemberTest ()
+		{
+			Assert.AreEqual (SWA.DockPattern.Pattern, SWA.DockPatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.DockPattern.Pattern);
+
+			Assert.AreEqual (SWA.DockPattern.DockPositionProperty, SWA.DockPatternIdentifiers.DockPositionProperty);
+			Assert.IsNotNull (SWA.DockPattern.DockPositionProperty);
+
+			Assert.AreEqual (SWA.ExpandCollapsePattern.Pattern, SWA.ExpandCollapsePatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.ExpandCollapsePattern.Pattern);
+
+			Assert.AreEqual (SWA.ExpandCollapsePattern.ExpandCollapseStateProperty, SWA.ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty);
+			Assert.IsNotNull (SWA.ExpandCollapsePattern.ExpandCollapseStateProperty);
+
+			Assert.AreEqual (SWA.GridItemPattern.Pattern, SWA.GridItemPatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.GridItemPattern.Pattern);
+
+			Assert.AreEqual (SWA.GridItemPattern.RowProperty, SWA.GridItemPatternIdentifiers.RowProperty);
+			Assert.IsNotNull (SWA.GridItemPattern.RowProperty);
+
+			Assert.AreEqual (SWA.GridItemPattern.ColumnProperty, SWA.GridItemPatternIdentifiers.ColumnProperty);
+			Assert.IsNotNull (SWA.GridItemPattern.ColumnProperty);
+
+			Assert.AreEqual (SWA.GridItemPattern.RowSpanProperty, SWA.GridItemPatternIdentifiers.RowSpanProperty);
+			Assert.IsNotNull (SWA.GridItemPattern.RowSpanProperty);
+
+			Assert.AreEqual (SWA.GridItemPattern.ColumnSpanProperty, SWA.GridItemPatternIdentifiers.ColumnSpanProperty);
+			Assert.IsNotNull (SWA.GridItemPattern.ColumnSpanProperty);
+
+			Assert.AreEqual (SWA.GridItemPattern.ContainingGridProperty, SWA.GridItemPatternIdentifiers.ContainingGridProperty);
+			Assert.IsNotNull (SWA.GridItemPattern.ContainingGridProperty);
+
+			Assert.AreEqual (SWA.GridPattern.Pattern, SWA.GridPatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.GridPattern.Pattern);
+
+			Assert.AreEqual (SWA.GridPattern.RowCountProperty, SWA.GridPatternIdentifiers.RowCountProperty);
+			Assert.IsNotNull (SWA.GridPattern.RowCountProperty);
+
+			Assert.AreEqual (SWA.GridPattern.ColumnCountProperty, SWA.GridPatternIdentifiers.ColumnCountProperty);
+			Assert.IsNotNull (SWA.GridPattern.ColumnCountProperty);
+
+			Assert.AreEqual (SWA.InvokePattern.Pattern, SWA.InvokePatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.InvokePattern.Pattern);
+
+			Assert.AreEqual (SWA.InvokePattern.InvokedEvent, SWA.InvokePatternIdentifiers.InvokedEvent);
+			Assert.IsNotNull (SWA.InvokePattern.InvokedEvent);
+
+			Assert.AreEqual (SWA.MultipleViewPattern.Pattern, SWA.MultipleViewPatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.MultipleViewPattern.Pattern);
+
+			Assert.AreEqual (SWA.MultipleViewPattern.CurrentViewProperty, SWA.MultipleViewPatternIdentifiers.CurrentViewProperty);
+			Assert.IsNotNull (SWA.MultipleViewPattern.CurrentViewProperty);
+
+			Assert.AreEqual (SWA.MultipleViewPattern.SupportedViewsProperty, SWA.MultipleViewPatternIdentifiers.SupportedViewsProperty);
+			Assert.IsNotNull (SWA.MultipleViewPattern.SupportedViewsProperty);
+
+			Assert.AreEqual (SWA.RangeValuePattern.Pattern, SWA.RangeValuePatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.RangeValuePattern.Pattern);
+
+			Assert.AreEqual (SWA.RangeValuePattern.ValueProperty, SWA.RangeValuePatternIdentifiers.ValueProperty);
+			Assert.IsNotNull (SWA.RangeValuePattern.ValueProperty);
+
+			Assert.AreEqual (SWA.RangeValuePattern.IsReadOnlyProperty, SWA.RangeValuePatternIdentifiers.IsReadOnlyProperty);
+			Assert.IsNotNull (SWA.RangeValuePattern.IsReadOnlyProperty);
+
+			Assert.AreEqual (SWA.RangeValuePattern.MinimumProperty, SWA.RangeValuePatternIdentifiers.MinimumProperty);
+			Assert.IsNotNull (SWA.RangeValuePattern.MinimumProperty);
+
+			Assert.AreEqual (SWA.RangeValuePattern.MaximumProperty, SWA.RangeValuePatternIdentifiers.MaximumProperty);
+			Assert.IsNotNull (SWA.RangeValuePattern.MaximumProperty);
+
+			Assert.AreEqual (SWA.RangeValuePattern.LargeChangeProperty, SWA.RangeValuePatternIdentifiers.LargeChangeProperty);
+			Assert.IsNotNull (SWA.RangeValuePattern.LargeChangeProperty);
+
+			Assert.AreEqual (SWA.RangeValuePattern.SmallChangeProperty, SWA.RangeValuePatternIdentifiers.SmallChangeProperty);
+			Assert.IsNotNull (SWA.RangeValuePattern.SmallChangeProperty);
+
+			Assert.AreEqual (SWA.ScrollItemPattern.Pattern, SWA.ScrollItemPatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.ScrollItemPattern.Pattern);
+
+			Assert.AreEqual (SWA.ScrollPattern.Pattern, SWA.ScrollPatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.ScrollPattern.Pattern);
+
+			Assert.AreEqual (SWA.ScrollPattern.HorizontalScrollPercentProperty, SWA.ScrollPatternIdentifiers.HorizontalScrollPercentProperty);
+			Assert.IsNotNull (SWA.ScrollPattern.HorizontalScrollPercentProperty);
+
+			Assert.AreEqual (SWA.ScrollPattern.VerticalScrollPercentProperty, SWA.ScrollPatternIdentifiers.VerticalScrollPercentProperty);
+			Assert.IsNotNull (SWA.ScrollPattern.VerticalScrollPercentProperty);
+
+			Assert.AreEqual (SWA.ScrollPattern.HorizontalViewSizeProperty, SWA.ScrollPatternIdentifiers.HorizontalViewSizeProperty);
+			Assert.IsNotNull (SWA.ScrollPattern.HorizontalViewSizeProperty);
+
+			Assert.AreEqual (SWA.ScrollPattern.VerticalViewSizeProperty, SWA.ScrollPatternIdentifiers.VerticalViewSizeProperty);
+			Assert.IsNotNull (SWA.ScrollPattern.VerticalViewSizeProperty);
+
+			Assert.AreEqual (SWA.ScrollPattern.HorizontallyScrollableProperty, SWA.ScrollPatternIdentifiers.HorizontallyScrollableProperty);
+			Assert.IsNotNull (SWA.ScrollPattern.HorizontallyScrollableProperty);
+
+			Assert.AreEqual (SWA.ScrollPattern.VerticallyScrollableProperty, SWA.ScrollPatternIdentifiers.VerticallyScrollableProperty);
+			Assert.IsNotNull (SWA.ScrollPattern.VerticallyScrollableProperty);
+
+			Assert.AreEqual (SWA.SelectionItemPattern.Pattern, SWA.SelectionItemPatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.SelectionItemPattern.Pattern);
+
+			Assert.AreEqual (SWA.SelectionItemPattern.IsSelectedProperty, SWA.SelectionItemPatternIdentifiers.IsSelectedProperty);
+			Assert.IsNotNull (SWA.SelectionItemPattern.IsSelectedProperty);
+
+			Assert.AreEqual (SWA.SelectionItemPattern.SelectionContainerProperty, SWA.SelectionItemPatternIdentifiers.SelectionContainerProperty);
+			Assert.IsNotNull (SWA.SelectionItemPattern.SelectionContainerProperty);
+
+			Assert.AreEqual (SWA.SelectionItemPattern.ElementAddedToSelectionEvent, SWA.SelectionItemPatternIdentifiers.ElementAddedToSelectionEvent);
+			Assert.IsNotNull (SWA.SelectionItemPattern.ElementAddedToSelectionEvent);
+
+			Assert.AreEqual (SWA.SelectionItemPattern.ElementRemovedFromSelectionEvent, SWA.SelectionItemPatternIdentifiers.ElementRemovedFromSelectionEvent);
+			Assert.IsNotNull (SWA.SelectionItemPattern.ElementRemovedFromSelectionEvent);
+
+			Assert.AreEqual (SWA.SelectionItemPattern.ElementSelectedEvent, SWA.SelectionItemPatternIdentifiers.ElementSelectedEvent);
+			Assert.IsNotNull (SWA.SelectionItemPattern.ElementSelectedEvent);
+
+			Assert.AreEqual (SWA.SelectionPattern.Pattern, SWA.SelectionPatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.SelectionPattern.Pattern);
+
+			Assert.AreEqual (SWA.SelectionPattern.SelectionProperty, SWA.SelectionPatternIdentifiers.SelectionProperty);
+			Assert.IsNotNull (SWA.SelectionPattern.SelectionProperty);
+
+			Assert.AreEqual (SWA.SelectionPattern.CanSelectMultipleProperty, SWA.SelectionPatternIdentifiers.CanSelectMultipleProperty);
+			Assert.IsNotNull (SWA.SelectionPattern.CanSelectMultipleProperty);
+
+			Assert.AreEqual (SWA.SelectionPattern.IsSelectionRequiredProperty, SWA.SelectionPatternIdentifiers.IsSelectionRequiredProperty);
+			Assert.IsNotNull (SWA.SelectionPattern.IsSelectionRequiredProperty);
+
+			Assert.AreEqual (SWA.SelectionPattern.InvalidatedEvent, SWA.SelectionPatternIdentifiers.InvalidatedEvent);
+			Assert.IsNotNull (SWA.SelectionPattern.InvalidatedEvent);
+
+			Assert.AreEqual (SWA.TableItemPattern.Pattern, SWA.TableItemPatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.TableItemPattern.Pattern);
+
+			Assert.AreEqual (SWA.TableItemPattern.RowHeaderItemsProperty, SWA.TableItemPatternIdentifiers.RowHeaderItemsProperty);
+			Assert.IsNotNull (SWA.TableItemPattern.RowHeaderItemsProperty);
+
+			Assert.AreEqual (SWA.TableItemPattern.ColumnHeaderItemsProperty, SWA.TableItemPatternIdentifiers.ColumnHeaderItemsProperty);
+			Assert.IsNotNull (SWA.TableItemPattern.ColumnHeaderItemsProperty);
+
+			Assert.AreEqual (SWA.TablePattern.Pattern, SWA.TablePatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.TablePattern.Pattern);
+
+			Assert.AreEqual (SWA.TablePattern.RowHeadersProperty, SWA.TablePatternIdentifiers.RowHeadersProperty);
+			Assert.IsNotNull (SWA.TablePattern.RowHeadersProperty);
+
+			Assert.AreEqual (SWA.TablePattern.ColumnHeadersProperty, SWA.TablePatternIdentifiers.ColumnHeadersProperty);
+			Assert.IsNotNull (SWA.TablePattern.ColumnHeadersProperty);
+
+			Assert.AreEqual (SWA.TablePattern.RowOrColumnMajorProperty, SWA.TablePatternIdentifiers.RowOrColumnMajorProperty);
+			Assert.IsNotNull (SWA.TablePattern.RowOrColumnMajorProperty);
+
+			Assert.AreEqual (SWA.TextPattern.AnimationStyleAttribute, SWA.TextPatternIdentifiers.AnimationStyleAttribute);
+			Assert.IsNotNull (SWA.TextPattern.AnimationStyleAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.BackgroundColorAttribute, SWA.TextPatternIdentifiers.BackgroundColorAttribute);
+			Assert.IsNotNull (SWA.TextPattern.BackgroundColorAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.BulletStyleAttribute, SWA.TextPatternIdentifiers.BulletStyleAttribute);
+			Assert.IsNotNull (SWA.TextPattern.BulletStyleAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.CapStyleAttribute, SWA.TextPatternIdentifiers.CapStyleAttribute);
+			Assert.IsNotNull (SWA.TextPattern.CapStyleAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.CultureAttribute, SWA.TextPatternIdentifiers.CultureAttribute);
+			Assert.IsNotNull (SWA.TextPattern.CultureAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.FontNameAttribute, SWA.TextPatternIdentifiers.FontNameAttribute);
+			Assert.IsNotNull (SWA.TextPattern.FontNameAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.FontSizeAttribute, SWA.TextPatternIdentifiers.FontSizeAttribute);
+			Assert.IsNotNull (SWA.TextPattern.FontSizeAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.FontWeightAttribute, SWA.TextPatternIdentifiers.FontWeightAttribute);
+			Assert.IsNotNull (SWA.TextPattern.FontWeightAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.ForegroundColorAttribute, SWA.TextPatternIdentifiers.ForegroundColorAttribute);
+			Assert.IsNotNull (SWA.TextPattern.ForegroundColorAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.HorizontalTextAlignmentAttribute, SWA.TextPatternIdentifiers.HorizontalTextAlignmentAttribute);
+			Assert.IsNotNull (SWA.TextPattern.HorizontalTextAlignmentAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.IndentationFirstLineAttribute, SWA.TextPatternIdentifiers.IndentationFirstLineAttribute);
+			Assert.IsNotNull (SWA.TextPattern.IndentationFirstLineAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.IndentationLeadingAttribute, SWA.TextPatternIdentifiers.IndentationLeadingAttribute);
+			Assert.IsNotNull (SWA.TextPattern.IndentationLeadingAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.IndentationTrailingAttribute, SWA.TextPatternIdentifiers.IndentationTrailingAttribute);
+			Assert.IsNotNull (SWA.TextPattern.IndentationTrailingAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.IsHiddenAttribute, SWA.TextPatternIdentifiers.IsHiddenAttribute);
+			Assert.IsNotNull (SWA.TextPattern.IsHiddenAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.IsItalicAttribute, SWA.TextPatternIdentifiers.IsItalicAttribute);
+			Assert.IsNotNull (SWA.TextPattern.IsItalicAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.IsReadOnlyAttribute, SWA.TextPatternIdentifiers.IsReadOnlyAttribute);
+			Assert.IsNotNull (SWA.TextPattern.IsReadOnlyAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.IsSubscriptAttribute, SWA.TextPatternIdentifiers.IsSubscriptAttribute);
+			Assert.IsNotNull (SWA.TextPattern.IsSubscriptAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.IsSuperscriptAttribute, SWA.TextPatternIdentifiers.IsSuperscriptAttribute);
+			Assert.IsNotNull (SWA.TextPattern.IsSuperscriptAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.MarginBottomAttribute, SWA.TextPatternIdentifiers.MarginBottomAttribute);
+			Assert.IsNotNull (SWA.TextPattern.MarginBottomAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.MarginLeadingAttribute, SWA.TextPatternIdentifiers.MarginLeadingAttribute);
+			Assert.IsNotNull (SWA.TextPattern.MarginLeadingAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.MarginTopAttribute, SWA.TextPatternIdentifiers.MarginTopAttribute);
+			Assert.IsNotNull (SWA.TextPattern.MarginTopAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.MarginTrailingAttribute, SWA.TextPatternIdentifiers.MarginTrailingAttribute);
+			Assert.IsNotNull (SWA.TextPattern.MarginTrailingAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.MixedAttributeValue, SWA.TextPatternIdentifiers.MixedAttributeValue);
+			Assert.IsNotNull (SWA.TextPattern.MixedAttributeValue);
+
+			Assert.AreEqual (SWA.TextPattern.OutlineStylesAttribute, SWA.TextPatternIdentifiers.OutlineStylesAttribute);
+			Assert.IsNotNull (SWA.TextPattern.OutlineStylesAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.OverlineColorAttribute, SWA.TextPatternIdentifiers.OverlineColorAttribute);
+			Assert.IsNotNull (SWA.TextPattern.OverlineColorAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.OverlineStyleAttribute, SWA.TextPatternIdentifiers.OverlineStyleAttribute);
+			Assert.IsNotNull (SWA.TextPattern.OverlineStyleAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.Pattern, SWA.TextPatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.TextPattern.Pattern);
+
+			Assert.AreEqual (SWA.TextPattern.StrikethroughColorAttribute, SWA.TextPatternIdentifiers.StrikethroughColorAttribute);
+			Assert.IsNotNull (SWA.TextPattern.StrikethroughColorAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.StrikethroughStyleAttribute, SWA.TextPatternIdentifiers.StrikethroughStyleAttribute);
+			Assert.IsNotNull (SWA.TextPattern.StrikethroughStyleAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.TabsAttribute, SWA.TextPatternIdentifiers.TabsAttribute);
+			Assert.IsNotNull (SWA.TextPattern.TabsAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.TextFlowDirectionsAttribute, SWA.TextPatternIdentifiers.TextFlowDirectionsAttribute);
+			Assert.IsNotNull (SWA.TextPattern.TextFlowDirectionsAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.UnderlineColorAttribute, SWA.TextPatternIdentifiers.UnderlineColorAttribute);
+			Assert.IsNotNull (SWA.TextPattern.UnderlineColorAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.UnderlineStyleAttribute, SWA.TextPatternIdentifiers.UnderlineStyleAttribute);
+			Assert.IsNotNull (SWA.TextPattern.UnderlineStyleAttribute);
+
+			Assert.AreEqual (SWA.TextPattern.TextChangedEvent, SWA.TextPatternIdentifiers.TextChangedEvent);
+			Assert.IsNotNull (SWA.TextPattern.TextChangedEvent);
+
+			Assert.AreEqual (SWA.TextPattern.TextSelectionChangedEvent, SWA.TextPatternIdentifiers.TextSelectionChangedEvent);
+			Assert.IsNotNull (SWA.TextPattern.TextSelectionChangedEvent);
+
+			Assert.AreEqual (SWA.TogglePattern.Pattern, SWA.TogglePatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.TogglePattern.Pattern);
+
+			Assert.AreEqual (SWA.TogglePattern.ToggleStateProperty, SWA.TogglePatternIdentifiers.ToggleStateProperty);
+			Assert.IsNotNull (SWA.TogglePattern.ToggleStateProperty);
+
+			Assert.AreEqual (SWA.ValuePattern.Pattern, SWA.ValuePatternIdentifiers.Pattern);
+			Assert.IsNotNull (SWA.ValuePattern.Pattern);
+
+			Assert.AreEqual (SWA.ValuePattern.ValueProperty, SWA.ValuePatternIdentifiers.ValueProperty);
+			Assert.IsNotNull (SWA.ValuePattern.ValueProperty);
+
+			Assert.AreEqual (SWA.ValuePattern.IsReadOnlyProperty, SWA.ValuePatternIdentifiers.IsReadOnlyProperty);
+			Assert.IsNotNull (SWA.ValuePattern.IsReadOnlyProperty);
+		}
+
+		[Test]
+		public void RemoveAutomationEventHandlerTest ()
+		{
+			int eventCount = 0;
+			Process p = BaseTest.StartApplication (@"SampleForm.exe", string.Empty);
+			potentiallyRunningProcesses.Add (p);
+			SWA.AutomationEventHandler handler = (o, e) => eventCount++;
+			Thread.Sleep (2000); // Waiting a little bit for the application to show up
+
+			SWA.AutomationElement testFormElement
+				= SWA.AutomationElement.RootElement.FindFirst (SWA.TreeScope.Children,
+					new SWA.PropertyCondition (AEIds.ProcessIdProperty, p.Id));
+			Assert.IsNotNull (testFormElement, "window");
+
+			SWA.Automation.RemoveAutomationEventHandler (SWA.AutomationElementIdentifiers.AsyncContentLoadedEvent,
+			                                             testFormElement,
+								     handler);
+
+			BaseTest.AssertRaises<ArgumentException> (
+			() => SWA.Automation.RemoveAutomationEventHandler (SWA.AutomationElementIdentifiers.AutomationFocusChangedEvent,
+				                                           testFormElement,
+									   handler),
+			      "SWA.AutomationElementIdentifiers.AutomationFocusChangedEvent");
+
+			BaseTest.AssertRaises<ArgumentException> (
+			() => SWA.Automation.RemoveAutomationEventHandler (SWA.AutomationElementIdentifiers.AutomationPropertyChangedEvent,
+			                                                   testFormElement,
+									   handler),
+			      "SWA.AutomationElementIdentifiers.AutomationPropertyChangedEvent");
+
+			SWA.Automation.RemoveAutomationEventHandler (SWA.AutomationElementIdentifiers.LayoutInvalidatedEvent,
+			                                             testFormElement,
+								     handler);
+			SWA.Automation.RemoveAutomationEventHandler (SWA.AutomationElementIdentifiers.MenuClosedEvent,
+			                                             testFormElement,
+								     handler);
+			SWA.Automation.RemoveAutomationEventHandler (SWA.AutomationElementIdentifiers.MenuOpenedEvent,
+			                                             testFormElement,
+								     handler);
+
+			BaseTest.AssertRaises<ArgumentException> (
+			() => SWA.Automation.RemoveAutomationEventHandler (SWA.AutomationElementIdentifiers.StructureChangedEvent,
+									   testFormElement,
+									   handler),
+			      "SWA.AutomationElementIdentifiers.StructureChangedEvent");
+
+			SWA.Automation.RemoveAutomationEventHandler (SWA.AutomationElementIdentifiers.ToolTipClosedEvent,
+			                                             testFormElement,
+								     handler);
+			SWA.Automation.RemoveAutomationEventHandler (SWA.AutomationElementIdentifiers.ToolTipOpenedEvent,
+			                                             testFormElement,
+								     handler);
+			SWA.Automation.RemoveAutomationEventHandler (SWA.InvokePatternIdentifiers.InvokedEvent,
+			                                             testFormElement,
+								     handler);
+			SWA.Automation.RemoveAutomationEventHandler (SWA.SelectionItemPatternIdentifiers.ElementAddedToSelectionEvent,
+			                                             testFormElement,
+								     handler);
+			SWA.Automation.RemoveAutomationEventHandler (SWA.SelectionItemPatternIdentifiers.ElementRemovedFromSelectionEvent,
+			                                             testFormElement,
+								     handler);
+			SWA.Automation.RemoveAutomationEventHandler (SWA.SelectionItemPatternIdentifiers.ElementSelectedEvent,
+			                                             testFormElement,
+								     handler);
+			SWA.Automation.RemoveAutomationEventHandler (SWA.SelectionPatternIdentifiers.InvalidatedEvent,
+			                                             testFormElement,
+								     handler);
+			SWA.Automation.RemoveAutomationEventHandler (SWA.TextPatternIdentifiers.TextChangedEvent,
+			                                             testFormElement,
+								     handler);
+			SWA.Automation.RemoveAutomationEventHandler (SWA.TextPatternIdentifiers.TextSelectionChangedEvent,
+			                                             testFormElement,
+								     handler);
+			SWA.Automation.RemoveAutomationEventHandler (SWA.WindowPatternIdentifiers.WindowOpenedEvent,
+			                                             testFormElement,
+								     handler);
+
+			p.Kill ();
+		}
+	}
+}
diff --git a/UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs b/UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs
new file mode 100644
index 0000000..41829ec
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/BaseTest.cs
@@ -0,0 +1,517 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//      Sandy Armstrong <sanfordarmstrong at gmail.com>
+// 
+
+using System;
+using System.Reflection;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+using At = System.Windows.Automation.Automation;
+using NUnit.Framework;
+using System.Text;
+
+namespace MonoTests.System.Windows.Automation
+{
+	public abstract class BaseTest
+	{
+		#region Setup/Teardown
+
+		protected Process p;
+		protected Dictionary<AutomationPattern, AutomationProperty> patternProperties;
+		protected AutomationElement testFormElement;
+		protected AutomationElement groupBoxElement;
+		protected AutomationElement groupBox1Element;
+		protected AutomationElement groupBox2Element;
+		protected AutomationElement groupBox3Element;
+		protected AutomationElement button1Element;
+		protected AutomationElement button2Element;
+		protected AutomationElement button3Element;
+		protected AutomationElement button4Element;
+		protected AutomationElement button5Element;
+		protected AutomationElement button6Element;
+		protected AutomationElement button7Element;
+		protected AutomationElement checkBox1Element;
+		protected AutomationElement checkBox2Element;
+		protected AutomationElement label1Element;
+		protected AutomationElement numericUpDown1Element;
+		protected AutomationElement numericUpDown2Element;
+		protected AutomationElement textbox1Element;
+		protected AutomationElement textbox2Element;
+		protected AutomationElement textbox3Element;
+		protected AutomationElement tb3horizontalScrollBarElement;
+		protected AutomationElement tb3verticalScrollBarElement;
+		protected AutomationElement horizontalMenuStripElement;
+		//protected AutomationElement verticalMenuStripElement;
+		protected AutomationElement panel1Element;
+		protected AutomationElement btnAddTextboxElement;
+		protected AutomationElement btnRemoveTextboxElement;
+		protected AutomationElement txtCommandElement;
+		protected AutomationElement btnRunElement;
+		protected AutomationElement treeView1Element;
+		protected AutomationElement table1Element;
+		protected AutomationElement listView1Element;
+		protected AutomationElement button8Element;
+
+		public static Process StartApplication (string name, string arguments)
+		{
+			Process p = new Process ();
+			p.StartInfo.FileName = name;
+			p.StartInfo.Arguments = arguments;
+			p.StartInfo.UseShellExecute = false;
+			p.StartInfo.CreateNoWindow = true;
+			p.Start ();
+			return p;
+		}
+
+		public static void CheckPatternIdentifiers<T> () where T : BasePattern
+		{
+			Type patternType = typeof (T);
+			Type patternIdsType = typeof (AutomationElementIdentifiers).Assembly.GetType
+				(patternType.FullName + "Identifiers");
+			foreach (var fieldInfo in patternType.GetFields
+			         (BindingFlags.Public | BindingFlags.Static)) {
+				string fieldName = fieldInfo.Name;
+				if (fieldName == "Pattern" || fieldName.EndsWith ("Property")
+				    || fieldName.EndsWith ("Event")) {
+					AutomationIdentifier value1 = fieldInfo.GetValue (null)
+						as AutomationIdentifier;
+					var fieldInfo2 = patternIdsType.GetField (fieldName, BindingFlags.Public | BindingFlags.Static);
+					AutomationIdentifier value2 = fieldInfo2.GetValue (null)
+						as AutomationIdentifier;
+					Assert.AreEqual (value2.Id, value1.Id,
+					                 string.Format ("{0}.{1}.Id",
+					                                patternType.Name, fieldName)
+					                 );
+					Assert.AreEqual (value2.ProgrammaticName, value1.ProgrammaticName,
+					                 string.Format ("{0}.{1}.ProgrammaticName",
+					                                patternType.Name, fieldName)
+					                 );
+				}
+			}
+		}
+
+		protected virtual void CustomFixtureSetUp ()
+		{
+			patternProperties = new Dictionary<AutomationPattern, AutomationProperty> ();
+			patternProperties.Add (DockPatternIdentifiers.Pattern, AEIds.IsDockPatternAvailableProperty);
+			patternProperties.Add (ExpandCollapsePatternIdentifiers.Pattern, AEIds.IsExpandCollapsePatternAvailableProperty);
+			patternProperties.Add (GridItemPatternIdentifiers.Pattern, AEIds.IsGridItemPatternAvailableProperty);
+			patternProperties.Add (GridPatternIdentifiers.Pattern, AEIds.IsGridPatternAvailableProperty);
+			patternProperties.Add (InvokePatternIdentifiers.Pattern, AEIds.IsInvokePatternAvailableProperty);
+			patternProperties.Add (MultipleViewPatternIdentifiers.Pattern, AEIds.IsMultipleViewPatternAvailableProperty);
+			patternProperties.Add (RangeValuePatternIdentifiers.Pattern, AEIds.IsRangeValuePatternAvailableProperty);
+			patternProperties.Add (ScrollItemPatternIdentifiers.Pattern, AEIds.IsScrollItemPatternAvailableProperty);
+			patternProperties.Add (ScrollPatternIdentifiers.Pattern, AEIds.IsScrollPatternAvailableProperty);
+			patternProperties.Add (SelectionItemPatternIdentifiers.Pattern, AEIds.IsSelectionItemPatternAvailableProperty);
+			patternProperties.Add (SelectionPatternIdentifiers.Pattern, AEIds.IsSelectionPatternAvailableProperty);
+			patternProperties.Add (TableItemPatternIdentifiers.Pattern, AEIds.IsTableItemPatternAvailableProperty);
+			patternProperties.Add (TablePatternIdentifiers.Pattern, AEIds.IsTablePatternAvailableProperty);
+			patternProperties.Add (TextPatternIdentifiers.Pattern, AEIds.IsTextPatternAvailableProperty);
+			patternProperties.Add (TogglePatternIdentifiers.Pattern, AEIds.IsTogglePatternAvailableProperty);
+			patternProperties.Add (TransformPatternIdentifiers.Pattern, AEIds.IsTransformPatternAvailableProperty);
+			patternProperties.Add (ValuePatternIdentifiers.Pattern, AEIds.IsValuePatternAvailableProperty);
+			patternProperties.Add (WindowPatternIdentifiers.Pattern, AEIds.IsWindowPatternAvailableProperty);
+
+			if (Atspi)
+				AtspiSetup ();
+			else
+				SWFSetup ();
+			Assert.IsNotNull (testFormElement);
+			Assert.IsNotNull (groupBox1Element);
+			Assert.IsNotNull (button1Element);
+			Assert.IsNotNull (button2Element);
+			Assert.IsNotNull (button3Element);
+			Assert.IsNotNull (button4Element);
+			Assert.IsNotNull (button5Element);
+			Assert.IsNotNull (button6Element);
+			Assert.IsNotNull (button7Element);
+			Assert.IsNotNull (label1Element);
+			Assert.IsNotNull (textbox1Element);
+			Assert.IsNotNull (textbox2Element);
+			Assert.IsNotNull (textbox3Element);
+			if (!Atspi) {
+				Assert.IsNotNull (groupBox2Element);
+				Assert.IsNotNull (groupBox3Element);
+				Assert.IsNotNull (tb3horizontalScrollBarElement);
+				Assert.IsNotNull (tb3verticalScrollBarElement);
+			}
+			Assert.IsNotNull (checkBox1Element);
+			Assert.IsNotNull (panel1Element);
+			Assert.IsNotNull (btnAddTextboxElement);
+			Assert.IsNotNull (btnRemoveTextboxElement);
+
+			Assert.IsNotNull (txtCommandElement);
+			Assert.IsNotNull (btnRunElement);
+			Assert.IsNotNull (numericUpDown1Element);
+			Assert.IsNotNull (treeView1Element);
+			Assert.IsNotNull (table1Element);
+
+			if (!Atspi)
+				Assert.IsNotNull (listView1Element);
+			Assert.IsNotNull (horizontalMenuStripElement);
+			//Assert.IsNotNull (verticalMenuStripElement);
+		}
+
+		[TestFixtureSetUp]
+		public void FixtureSetUp ()
+		{
+			try {
+				CustomFixtureSetUp ();
+			} catch {
+				FixtureTearDown ();
+				throw;
+			}
+		}
+
+		[TestFixtureTearDown]
+		public void FixtureTearDown ()
+		{
+			if (p != null && !p.HasExited) {
+				p.Kill ();
+			}
+			p = null;
+		}
+
+		private void SWFSetup ()
+		{
+			p = StartApplication (@"SampleForm.exe",
+				String.Empty);
+
+			Thread.Sleep (4000);
+
+			testFormElement = AutomationElement.RootElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ProcessIdProperty,
+					p.Id));
+			groupBox1Element = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Group));
+			groupBox2Element = groupBox1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"groupBox2"));
+			groupBox3Element = groupBox1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"groupBox3"));
+			button1Element = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"button1"));
+			textbox1Element = testFormElement.FindAll (TreeScope.Children,
+				new AndCondition (new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Edit),
+					new PropertyCondition (AEIds.IsPasswordProperty, false))) [1];
+			textbox2Element = testFormElement.FindFirst (TreeScope.Children,
+				new AndCondition (new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Edit),
+					new PropertyCondition (AEIds.IsPasswordProperty, true)));
+			label1Element = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Text));
+			button2Element = groupBox1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"button2"));
+			button3Element = groupBox1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"button3"));
+			button4Element = groupBox1Element.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty,
+					"button4"));
+			button5Element = groupBox1Element.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty,
+					"button5"));
+			button6Element = groupBox1Element.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty,
+					"button6"));
+			button7Element = groupBox1Element.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty,
+					"button7"));
+			checkBox1Element = groupBox2Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"checkBox1"));
+			textbox3Element = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Document));
+			tb3horizontalScrollBarElement = textbox3Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.OrientationProperty,
+					OrientationType.Horizontal));
+			tb3verticalScrollBarElement = textbox3Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.OrientationProperty,
+					OrientationType.Vertical));
+			groupBox2Element = groupBox1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"groupBox2"));
+			checkBox1Element = groupBox2Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.CheckBox));
+			panel1Element = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Pane));
+			btnAddTextboxElement = panel1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"Add"));
+			btnRemoveTextboxElement = panel1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"Remove"));
+
+			txtCommandElement = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty, "txtCommand"));
+
+			btnRunElement = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty, "Run"));
+
+			treeView1Element = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Tree));
+			numericUpDown1Element = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Spinner));
+			table1Element = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty, "dataGridView1"));
+			listView1Element = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty, "listView1"));
+			button8Element = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty, "button8"));
+			horizontalMenuStripElement = testFormElement.FindFirst (TreeScope.Descendants,
+			        new PropertyCondition (AEIds.NameProperty,
+			                "menuStrip1"));
+			//verticalMenuStripElement = testFormElement.FindFirst (TreeScope.Descendants,
+			//        new PropertyCondition (AEIds.NameProperty,
+			//                "menuStrip2"));
+		}
+
+		private void AtspiSetup ()
+		{
+			string name = "GtkForm.exe";
+			p = StartApplication (name, String.Empty);
+
+			Thread.Sleep (1000);
+
+			testFormElement = AutomationElement.RootElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ProcessIdProperty,
+					p.Id));
+			groupBoxElement = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Group));
+			groupBox1Element = groupBoxElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Group));
+			groupBox2Element = groupBox1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"groupBox2"));
+			groupBox3Element = groupBox1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"groupBox3"));
+			button1Element = groupBoxElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Button));
+			textbox1Element = groupBoxElement.FindFirst (TreeScope.Children,
+				new AndCondition (new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Edit),
+					new PropertyCondition (AEIds.IsPasswordProperty, false)));
+			textbox2Element = groupBoxElement.FindFirst (TreeScope.Children,
+				new AndCondition (new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Edit),
+					new PropertyCondition (AEIds.IsPasswordProperty, true)));
+			label1Element = groupBoxElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Text));
+			button2Element = groupBox1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"button2"));
+			button3Element = groupBox1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"button3"));
+			button4Element = groupBox1Element.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty,
+					"button4"));
+			button5Element = groupBox1Element.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty,
+					"button5"));
+			button6Element = groupBox1Element.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty,
+					"button6"));
+			button7Element = groupBox1Element.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty,
+					"button7"));
+			checkBox1Element = groupBox2Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.CheckBox));
+			textbox3Element = groupBoxElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Document));
+			checkBox2Element = groupBoxElement.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty,
+					"checkbox2"));
+			btnAddTextboxElement = groupBoxElement.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty,
+					"Add"));
+			panel1Element = TreeWalker.RawViewWalker.GetParent (btnAddTextboxElement);
+			btnRemoveTextboxElement = panel1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"Remove"));
+
+			txtCommandElement = groupBoxElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty, "txtCommand"));
+
+			btnRunElement = groupBoxElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty, "Run"));
+
+			treeView1Element = groupBoxElement.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Tree));
+			table1Element = groupBoxElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"dataGridView1"));
+			numericUpDown1Element = groupBoxElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Slider));
+			listView1Element = groupBoxElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.NameProperty,
+					"listView1"));
+			horizontalMenuStripElement = testFormElement.FindFirst (TreeScope.Descendants,
+			        new PropertyCondition (AEIds.ControlTypeProperty,
+			                ControlType.MenuBar));
+		}
+
+		protected void DisableControls ()
+		{
+			InvokePattern pattern = (InvokePattern) button4Element.GetCurrentPattern (InvokePatternIdentifiers.Pattern);
+			pattern.Invoke ();
+			if (Atspi)
+				Thread.Sleep (2000);
+		}
+
+		protected void EnableControls ()
+		{
+			InvokePattern pattern = (InvokePattern) button4Element.GetCurrentPattern (InvokePatternIdentifiers.Pattern);
+			pattern.Invoke ();
+			if (Atspi)
+				Thread.Sleep (2000);
+		}
+
+		#endregion
+
+		protected void RunCommand (string command)
+		{
+			ValuePattern cmd = (ValuePattern) txtCommandElement.GetCurrentPattern (ValuePattern.Pattern);
+			cmd.SetValue (command);
+			Thread.Sleep (500);
+			InvokePattern run = (InvokePattern) btnRunElement.GetCurrentPattern (InvokePattern.Pattern);
+			run.Invoke ();
+			Thread.Sleep (500);
+		}
+
+		public virtual bool Atspi {
+			get {
+				return false;
+			}
+		}
+
+		public static AutomationProperty [] GetPatternProperties (AutomationPattern pattern)
+		{
+			List<AutomationProperty> props = new List<AutomationProperty> ();
+			var patternName = string.Format (
+				"System.Windows.Automation.{0}Pattern",
+				At.PatternName (pattern));
+			Type t = typeof(DockPattern).Assembly.GetType(patternName);
+			Assert.IsNotNull (t, "Unknown pattern type");
+			foreach (FieldInfo info in t.GetFields (
+				BindingFlags.Public | BindingFlags.Static)) {
+				if (info.Name.EndsWith ("Property")) {
+					props.Add ((AutomationProperty)info.GetValue (null));
+				}
+			}
+			return props.ToArray();
+		}
+
+		public static void AssertRaises<T> (Action a, string message) where T : Exception
+		{
+			bool exceptionRaised = false;
+			try {
+				a ();
+			} catch (T) {
+				exceptionRaised = true;
+			}
+			Assert.IsTrue (exceptionRaised,
+			               string.Format ("Expected {0} when {1}",
+			                              typeof (T), message));
+		}
+
+		public static void AssertWontRaise<T> (Action a, string message) where T : Exception
+		{
+			T ex = null;
+			try {
+				a ();
+			} catch (T e) {
+				ex = e;
+			}
+			Assert.IsNull (ex,
+			               string.Format ("Didn't expected '{0}' when {1}",
+			                              ex, message));
+		}
+
+		public static string PrintRuntimeId (int [] runtimeId)
+		{
+			StringBuilder sb = new StringBuilder();
+			sb.Append ("[");
+			foreach (int id in runtimeId)
+				sb.AppendFormat ("{0},", id);
+			if (sb[sb.Length - 1] == ',')
+				sb[sb.Length - 1] = ']';
+			else
+				sb.Append ("]");
+			return sb.ToString ();
+		}
+
+		protected void VerifyPatterns (AutomationElement element, params AutomationPattern [] expected)
+		{
+			List<AutomationPattern> expectedPatterns = new List<AutomationPattern> (expected);
+			List<AutomationPattern> supportedPatterns = new List<AutomationPattern> (element.GetSupportedPatterns ());
+				object pattern1 = null, pattern2;
+
+			foreach (AutomationPattern pattern in patternProperties.Keys) {
+				bool patternProperty = (bool) element.GetCurrentPropertyValue (patternProperties [pattern]);
+				if (expectedPatterns.Contains (pattern)) {
+					try {
+						pattern1 = element.GetCurrentPattern (pattern);
+					} catch (InvalidOperationException) {
+						Assert.Fail ("GetCurrentPattern should not throw InvalidOperationException: " + pattern.ProgrammaticName);
+					}
+					Assert.IsNotNull (pattern1, "GetCurrentPattern should not return null: " + pattern.ProgrammaticName);
+					Assert.IsTrue (element.TryGetCurrentPattern (pattern, out pattern2), "TryGetCurrentPattern should return true: " + pattern.ProgrammaticName);
+					Assert.IsNotNull (pattern2, "TryGetCurrentPattern should not return null: " + pattern.ProgrammaticName);
+					Assert.IsTrue (supportedPatterns.Contains (pattern), "GetSupportedPatterns should return pattern: " + pattern.ProgrammaticName);
+					Assert.IsTrue (patternProperty, "Pattern property: " + pattern.ProgrammaticName);
+				} else {
+					try {
+						pattern1 = element.GetCurrentPattern (pattern);
+						Assert.Fail ("GetCurrentPattern should return an InvalidOperation exception: " + pattern.ProgrammaticName);
+					} catch (InvalidOperationException) { }
+					Assert.IsFalse (element.TryGetCurrentPattern (pattern, out pattern2), "TryGetCurrentPattern should return false: " + pattern.ProgrammaticName);
+					Assert.IsFalse (supportedPatterns.Contains (pattern), "GetSupportedPatterns should not return pattern: " + pattern.ProgrammaticName);
+					Assert.IsFalse (patternProperty, "Pattern property: " + pattern.ProgrammaticName);
+				}
+			}
+
+		}
+	}
+}
diff --git a/UIAutomationClientTests/UIAutomationClientTests/CacheRequestTest.cs b/UIAutomationClientTests/UIAutomationClientTests/CacheRequestTest.cs
new file mode 100644
index 0000000..f95dd8b
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/CacheRequestTest.cs
@@ -0,0 +1,2162 @@
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
+//
+// Authors:
+//  Sandy Armstrong <sanfordarmstrong at gmail.com>
+//
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using System.Windows.Automation;
+using SWA = System.Windows.Automation;
+using System.Windows.Automation.Text;
+
+using At = System.Windows.Automation.Automation;
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace MonoTests.System.Windows.Automation
+{
+	[TestFixture]
+	public class CacheRequestTest : BaseTest
+	{
+		// TODO: Test behavior of AutomationElements passed to StructureChanged event handlers which were signed up while there was an active CacheRequest:
+		// TODO: Out-of-order calls to Dispose
+		// TODO: Test GetUpdatedCache with AutomationElementMode.None
+		// TODO: Test GetCurrentPropertyValue with AutomationElementMode.None
+		// TODO: CachedChildren/CachedParent with GetUpdatedCache (activated and not)
+
+		private readonly CacheRequest originalCurrent = CacheRequest.Current;
+		private int eventCount;
+		private AutomationElement eventElement;
+		private AutomationElement hScrollBarElement;
+
+		[SetUp]
+		public void SetUp ()
+		{
+			while (CacheRequest.Current != originalCurrent)
+				CacheRequest.Current.Pop ();
+			Assert.AreEqual (originalCurrent, CacheRequest.Current,
+				"At SetUp time, CacheRequest.Current should be set back to the original request");
+
+			// to enable textBox3's horizontal scroll bar.
+			RunCommand ("set textBox3 long text");
+
+			AndCondition horizontalScrollCondition =
+				new AndCondition (
+					new PropertyCondition (AutomationElementIdentifiers.ControlTypeProperty,
+						ControlType.ScrollBar),
+					new PropertyCondition (AutomationElementIdentifiers.OrientationProperty,
+						OrientationType.Horizontal));
+			hScrollBarElement = textbox3Element.FindFirst (TreeScope.Children, horizontalScrollCondition);
+			Assert.IsNotNull (hScrollBarElement);
+
+		}
+
+		[TearDown]
+		public void TearDown ()
+		{
+			Assert.AreEqual (originalCurrent, CacheRequest.Current,
+				"At TearDown time, CacheRequest.Current should be set back to the original request");
+		}
+
+		[Test]
+		public void ActiveRequestModificationTest ()
+		{
+			// Test modifying originalCurrent
+			AssertRaises<InvalidOperationException> (
+				() => originalCurrent.Add (AutomationElement.ControlTypeProperty),
+				"calling Add on original CacheRequest");
+			AssertRaises<InvalidOperationException> (
+				() => originalCurrent.AutomationElementMode = AutomationElementMode.None,
+				"setting AutomationElementMode on original CacheRequest");
+			AssertRaises<InvalidOperationException> (
+				() => originalCurrent.TreeScope = TreeScope.Children,
+				"setting TreeScope on original CacheRequest");
+			AssertRaises<InvalidOperationException> (
+				() => originalCurrent.TreeFilter = SWA.Automation.ContentViewCondition,
+				"setting TreeFilter on original CacheRequest");
+
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.NameProperty);
+			request.Push ();
+
+			AssertRaises<InvalidOperationException> (
+				() => request.Add (AutomationElement.ControlTypeProperty),
+				"calling Add on active CacheRequest");
+			AssertRaises<InvalidOperationException> (
+				() => request.AutomationElementMode = AutomationElementMode.None,
+				"setting AutomationElementMode on active CacheRequest");
+			AssertRaises<InvalidOperationException> (
+				() => request.TreeScope = TreeScope.Children,
+				"setting TreeScope on active CacheRequest");
+			AssertRaises<InvalidOperationException> (
+				() => request.TreeFilter = SWA.Automation.ContentViewCondition,
+				"setting TreeFilter on active CacheRequest");
+
+			var request2 = new CacheRequest ();
+			request2.Add (AutomationElement.ControlTypeProperty);
+			request2.Push ();
+
+			AssertRaises<InvalidOperationException> (
+				() => request.Add (AutomationElement.ControlTypeProperty),
+				"calling Add on inactive CacheRequest that's still on the stack");
+			AssertRaises<InvalidOperationException> (
+				() => request.AutomationElementMode = AutomationElementMode.None,
+				"setting AutomationElementMode on inactive CacheRequest that's still on the stack");
+			AssertRaises<InvalidOperationException> (
+				() => request.TreeScope = TreeScope.Children,
+				"setting TreeScope on inactive CacheRequest that's still on the stack");
+			AssertRaises<InvalidOperationException> (
+				() => request.TreeFilter = SWA.Automation.ContentViewCondition,
+				"setting TreeFilter on inactive CacheRequest that's still on the stack");
+
+			request2.Pop ();
+
+			var request3 = new CacheRequest ();
+			var disposable3 = request3.Activate ();
+
+			AssertRaises<InvalidOperationException> (
+				() => request.Add (AutomationElement.ControlTypeProperty),
+				"calling Add on inactive CacheRequest that's still on the stack");
+			AssertRaises<InvalidOperationException> (
+				() => request.AutomationElementMode = AutomationElementMode.None,
+				"setting AutomationElementMode on inactive CacheRequest that's still on the stack");
+			AssertRaises<InvalidOperationException> (
+				() => request.TreeScope = TreeScope.Children,
+				"setting TreeScope on inactive CacheRequest that's still on the stack");
+			AssertRaises<InvalidOperationException> (
+				() => request.TreeFilter = SWA.Automation.ContentViewCondition,
+				"setting TreeFilter on inactive CacheRequest that's still on the stack");
+
+			request2.Push ();
+
+			AssertRaises<InvalidOperationException> (
+				() => request3.Add (AutomationElement.ControlTypeProperty),
+				"calling Add on activated CacheRequest that's not on top of stack");
+			AssertRaises<InvalidOperationException> (
+				() => request3.AutomationElementMode = AutomationElementMode.None,
+				"setting AutomationElementMode on activated CacheRequest that's not on top of stack");
+			AssertRaises<InvalidOperationException> (
+				() => request3.TreeScope = TreeScope.Children,
+				"setting TreeScope on activated CacheRequest that's not on top of stack");
+			AssertRaises<InvalidOperationException> (
+				() => request3.TreeFilter = SWA.Automation.ContentViewCondition,
+				"setting TreeFilter on activated CacheRequest that's not on top of stack");
+
+			request2.Pop ();
+
+			disposable3.Dispose ();
+
+			request.Pop ();
+
+			// Test modifying a request once it's no longer on the stack
+			request.Add (AutomationElement.ControlTypeProperty);
+			request.AutomationElementMode = AutomationElementMode.None;
+			request.TreeScope = TreeScope.Children;
+			request.TreeFilter = SWA.Automation.ContentViewCondition;
+		}
+
+		[Test]
+		public void TreeWalkerTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.NameProperty);
+			request.Push ();
+
+			Condition buttonCondition = new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Button);
+			TreeWalker buttonWalker = new TreeWalker (buttonCondition);
+
+			var button7ElementRef2 = buttonWalker.GetFirstChild (groupBox1Element);
+
+			AssertRaises<InvalidOperationException> (
+				() => button7ElementRef2.Cached.Name.ToString (),
+				"calling Cached.Name on element gotten from TreeWalker without specifying a CacheRequest");
+
+			AssertRaises<ArgumentNullException> (
+				() => button7ElementRef2 = buttonWalker.GetFirstChild (groupBox1Element, null),
+				"passing null CacheRequest into TreeWalker.GetFirstChild");
+
+			// Even inactive CacheRequests work just fine
+			var inactiveRequest = new CacheRequest ();
+			inactiveRequest.Add (AutomationElement.ControlTypeProperty);
+			button7ElementRef2 = buttonWalker.GetFirstChild (groupBox1Element, inactiveRequest);
+			Assert.AreEqual (ControlType.Button, button7ElementRef2.Cached.ControlType, "Cached.ControlType");
+			AssertRaises<InvalidOperationException> (
+				() => button7ElementRef2.Cached.Name.ToString (),
+				"calling Cached.Name on element fetched from TreeWalker with (invalid) CacheRequest that doesn't specify NameProperty");
+
+			button7ElementRef2 = buttonWalker.GetFirstChild (groupBox1Element, request);
+			Assert.AreEqual (button7Element.Current.Name, button7ElementRef2.Cached.Name, "Cached.Name");
+			AssertRaises<InvalidOperationException> (
+				() => button7ElementRef2.Cached.ControlType.ToString (),
+				"calling Cached.Name on element fetched from TreeWalker with (invalid) CacheRequest that doesn't specify ControlTypeProperty");
+
+			AssertRaises<ArgumentNullException> (
+				() => buttonWalker.GetFirstChild (null, request),
+				"passing null element to GetFirstChild");
+			AssertRaises<ArgumentNullException> (
+				() => buttonWalker.GetFirstChild (groupBox1Element, null),
+				"passing null request to GetFirstChild");
+
+			request.Pop ();
+
+			request = new CacheRequest ();
+			request.Add (AutomationElement.NameProperty);
+			request.TreeFilter = new PropertyCondition (AutomationElement.ControlTypeProperty, ControlType.Button);
+			using (request.Activate ()) {
+				button7ElementRef2 = button7Element.GetUpdatedCache (request);
+				Assert.AreEqual (button7Element.Current.Name, button7ElementRef2.Cached.Name, "Cached.Name");
+				// GetUpdatedCache works just fine, even for elements not in scope
+				AutomationElement treeView1ElementRef2 = treeView1Element.GetUpdatedCache (request);
+				Assert.AreEqual (treeView1Element.Current.Name, treeView1ElementRef2.Cached.Name, "Cached.Name");
+
+				AutomationElement element = TreeWalker.RawViewWalker.GetFirstChild (testFormElement);
+				AutomationElement elementRef2 = TreeWalker.RawViewWalker.GetFirstChild (testFormElement, request);
+				Assert.AreEqual (element.Current.Name, elementRef2.Cached.Name, "Cached.Name");
+				element = TreeWalker.RawViewWalker.GetFirstChild (treeView1Element);
+				elementRef2 = TreeWalker.RawViewWalker.GetFirstChild (treeView1Element, request);
+				// This works, too
+				Assert.AreEqual (element.Current.Name, elementRef2.Cached.Name, "Cached.Name");
+			}
+
+			// TODO: More tests with restrictive TreeFilter/TreeScope
+		}
+
+		[Test]
+		public void GetCachedPropertyValueTest ()
+		{
+			AssertRaises<InvalidOperationException> (
+				() => groupBox1Element.GetCachedPropertyValue (AutomationElement.NameProperty),
+				"calling GetCachedPropertyValue on an element with no cache");
+			AssertRaises<InvalidOperationException> (
+				() => groupBox1Element.GetCachedPropertyValue (AutomationElement.NameProperty, true),
+				"calling GetCachedPropertyValue on an element with no cache");
+			AssertRaises<InvalidOperationException> (
+				() => groupBox1Element.GetCachedPropertyValue (AutomationElement.NameProperty, false),
+				"calling GetCachedPropertyValue on an element with no cache");
+
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.NameProperty);
+			request.Push ();
+
+			var groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+
+			AssertRaises<InvalidOperationException> (
+				() => groupBox1Element.GetCachedPropertyValue (AutomationElement.NameProperty),
+				"calling GetCachedPropertyValue on an element instance fetched without an active cache request");
+
+			Assert.AreEqual (groupBox1Element.Current.Name,
+				groupBox1ElementRef2.GetCachedPropertyValue (AutomationElement.NameProperty));
+
+			VerifyCachedPropertyValue (groupBox1ElementRef2,
+				AEIds.NameProperty,
+				groupBox1Element.Current.Name,
+				groupBox1Element.Current.Name,
+				groupBox1Element.Current.Name);
+
+			AssertRaises<InvalidOperationException> (
+				() => groupBox1ElementRef2.GetCachedPropertyValue (AutomationElement.OrientationProperty),
+				"calling GetCachedPropertyValue for an uncached property");
+
+			var request2 = new CacheRequest ();
+			request2.Add (AutomationElement.OrientationProperty);
+			request2.Push ();
+
+			groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request2);
+
+			VerifyCachedPropertyValue (groupBox1ElementRef2,
+				AEIds.OrientationProperty,
+				AutomationElement.NotSupported,
+				OrientationType.None,
+				OrientationType.None);
+
+			request2.Pop ();
+			request.Pop ();
+		}
+
+		[Test]
+		public void CachedChildrenTest ()
+		{
+			// NOTE: This property is generally tested in other tests
+			AssertRaises<InvalidOperationException> (
+				() => testFormElement.CachedChildren.ToString (),
+				"accessing CachedChildren on element retrieved with no active CacheRequest");
+		}
+
+		[Test]
+		public void CachedParentTest ()
+		{
+			// NOTE: This property is generally tested in other tests
+			AssertRaises<InvalidOperationException> (
+				() => button1Element.CachedParent.ToString (),
+				"accessing CachedParent on element retrieved with no active CacheRequest");
+		}
+
+		[Test]
+		public void CachedTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.NameProperty);
+
+			AutomationElement label1ElementRef2 = null;
+
+			using (request.Activate ()) {
+				label1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Text));
+
+				var cache = label1ElementRef2.Cached;
+				Assert.AreEqual ("label1", cache.Name);
+				Assert.AreEqual ("label1", label1ElementRef2.Cached.Name);
+
+				RunCommand ("click button1");
+				Thread.Sleep (500);
+
+				Assert.AreEqual ("button1_click", label1ElementRef2.Current.Name);
+
+				Assert.AreEqual ("label1", cache.Name);
+				Assert.AreEqual ("label1", label1ElementRef2.Cached.Name);
+			}
+
+			Assert.AreEqual ("label1", label1ElementRef2.Cached.Name);
+
+			request = new CacheRequest ();
+			request.Add (ValuePattern.ValueProperty);
+			request.Add (ValuePattern.Pattern);
+
+			ValuePattern txtCommandCachedValuePattern = null;
+
+			using (request.Activate ()) {
+				AutomationElement txtCommandElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.NameProperty, "txtCommand"));
+				txtCommandCachedValuePattern = (ValuePattern)
+					txtCommandElementRef2.GetCachedPattern (ValuePattern.Pattern);
+
+				var cache = txtCommandCachedValuePattern.Cached;
+				Assert.AreEqual ("click button1", cache.Value);
+				Assert.AreEqual ("click button1", txtCommandCachedValuePattern.Cached.Value);
+
+				RunCommand ("set textbox3 text");
+				Thread.Sleep (500);
+
+				Assert.AreEqual ("set textbox3 text", txtCommandCachedValuePattern.Current.Value);
+
+				Assert.AreEqual ("click button1", cache.Value);
+				Assert.AreEqual ("click button1", txtCommandCachedValuePattern.Cached.Value);
+			}
+
+			Assert.AreEqual ("click button1", txtCommandCachedValuePattern.Cached.Value);
+
+			// TODO: Fix this test case on Linux (fails because textbox name is coming from label)
+			//var request = new CacheRequest ();
+			//request.Add (AutomationElement.NameProperty);
+
+			//AutomationElement textbox3ElementRef2 = null;
+
+			//using (request.Activate ()) {
+			//        textbox3ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+			//                new PropertyCondition (AEIds.ControlTypeProperty,
+			//                        ControlType.Document));
+
+			//        var cache = textbox3ElementRef2.Cached;
+			//        Assert.AreEqual ("abcdefgabcdefgabcdef\n\n\n\n\n\n\n\ngabcdefgabcdefg", cache.Name);
+			//        Assert.AreEqual ("abcdefgabcdefgabcdef\n\n\n\n\n\n\n\ngabcdefgabcdefg", textbox3ElementRef2.Cached.Name);
+
+			//        RunCommand ("set textbox3 text");
+			//        Thread.Sleep (500);
+
+			//        Assert.AreEqual ("abcdefgabcdefgabcdef\n\n\n\n\n\n\n\ngabcdefgabcdefg", cache.Name);
+			//        Assert.AreEqual ("abcdefgabcdefgabcdef\n\n\n\n\n\n\n\ngabcdefgabcdefg", textbox3ElementRef2.Cached.Name);
+			//}
+
+			//Assert.AreEqual ("abcdefgabcdefgabcdef\n\n\n\n\n\n\n\ngabcdefgabcdefg", textbox3ElementRef2.Cached.Name);
+		}
+
+		[Test]
+		public void BasicPatternTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (WindowPattern.CanMaximizeProperty);
+
+			var testFormElementRef2 = testFormElement.GetUpdatedCache (request);
+
+			Assert.AreEqual (testFormElement.GetCurrentPropertyValue (WindowPattern.CanMaximizeProperty),
+				testFormElementRef2.GetCachedPropertyValue (WindowPattern.CanMaximizeProperty),
+				"GetCachedPropertyValue");
+
+			var windowPattern = (WindowPattern) testFormElementRef2.GetCurrentPattern (WindowPattern.Pattern);
+			AssertRaises<InvalidOperationException> (
+				() => windowPattern.Cached.ToString (),
+				"accessing WindowPattern.Cached on pattern returned from GetCurrentPattern");
+
+			AssertRaises<InvalidOperationException> (
+				() => testFormElementRef2.GetCachedPattern (WindowPattern.Pattern),
+				"calling GetCachedPattern when WindowPattern is not cached (even though one of its properties is)");
+			object patternObj;
+			Assert.IsFalse (testFormElementRef2.TryGetCachedPattern (WindowPattern.Pattern, out patternObj),
+				"TryGetCachedPattern with uncached pattern");
+			Assert.IsNull (patternObj, "output of TryGetCachedPattern when pattern not found");
+
+			request.Add (WindowPattern.Pattern);
+			testFormElementRef2 = testFormElement.GetUpdatedCache (request);
+
+			AssertRaises<InvalidOperationException> (
+				() => testFormElementRef2.GetCachedPattern (InvokePattern.Pattern),
+				"calling GetCachedPattern with unsupported and uncached pattern");
+
+			request.Add (InvokePattern.Pattern);
+			testFormElementRef2 = testFormElement.GetUpdatedCache (request);
+
+			AssertRaises<InvalidOperationException> (
+				() => testFormElementRef2.GetCachedPattern (InvokePattern.Pattern),
+				"calling GetCachedPattern with unsupported (but cached) pattern for the element");
+
+			windowPattern = (WindowPattern) testFormElementRef2.GetCachedPattern (WindowPattern.Pattern);
+			Assert.AreEqual (testFormElement.GetCurrentPropertyValue (WindowPattern.CanMaximizeProperty),
+				windowPattern.Cached.CanMaximize,
+				"WindowPattern.Cached.CanMaximize");
+			AssertRaises<InvalidOperationException> (
+				() => windowPattern.Cached.CanMinimize.ToString (),
+				"accessing WindowPattern.Cached.CanMinimize when only WindowPattern and CanMaximizeProperty are cached");
+
+			Assert.IsTrue (testFormElementRef2.TryGetCachedPattern (WindowPattern.Pattern, out patternObj),
+				"TryGetCachedPattern with cached pattern");
+			Assert.IsNotNull (patternObj as WindowPattern, "output of TryGetCachedPattern when pattern found");
+		}
+
+		[Test]
+		public void AddTest ()
+		{
+			var request = new CacheRequest ();
+
+			AutomationProperty nullProp = null;
+			AssertRaises<ArgumentNullException> (
+				() => request.Add (nullProp),
+				"passing null property");
+
+			AutomationPattern nullPattern = null;
+			AssertRaises<ArgumentNullException> (
+				() => request.Add (nullPattern),
+				"passing null pattern");
+
+			request.Add (AutomationElement.NameProperty);
+
+			// Multiple identical calls to Add should be okay
+			request.Add (AutomationElement.NameProperty);
+
+			AutomationElement button1ElementRef2;
+			using (request.Activate ()) {
+				button1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.NameProperty,
+						"button1"));
+			}
+
+			Assert.AreEqual (button1Element.Current.Name,
+				button1ElementRef2.Current.Name,
+				"Both references to button1Element should have the same Current.Name");
+
+			Assert.AreEqual (button1Element.Current.Name,
+				button1ElementRef2.Cached.Name,
+				"button1Element Cached.Name should be the same as Current.Name");
+
+			Assert.IsNotNull (button1Element.Cached,
+				"Original button1Element reference can be accessed, even if its properties cannot");
+
+			AssertRaises<InvalidOperationException> (
+				() => button1Element.Cached.Name.ToString (),
+				"checking for cached NameProperty on original button1Element reference");
+
+			AssertRaises<InvalidOperationException> (
+				() => button1ElementRef2.Cached.ControlType.ToString (),
+				"checking for cached ControlTypeProperty, since it wasn't part of the CacheRequest");
+
+			request.Add (AutomationElement.ControlTypeProperty);
+
+			AssertRaises<InvalidOperationException> (
+				() => button1ElementRef2.Cached.ControlType.ToString (),
+				"checking for cached ControlTypeProperty, after adding to inactive CacheRequest");
+
+			request.Activate ().Dispose ();
+
+			AssertRaises<InvalidOperationException> (
+				() => button1ElementRef2.Cached.ControlType.ToString (),
+				"checking for cached ControlTypeProperty, after adding to inactive CacheRequest");
+
+			using (request.Activate ()) {
+				button1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Button));
+			}
+
+			Assert.AreEqual (button1Element.Current.ControlType,
+				button1ElementRef2.Cached.ControlType,
+				"ControlType caching should work after accessing element while request was active");
+		}
+
+		[Test]
+		public void ActivateTest ()
+		{
+			var request1 = new CacheRequest ();
+			var request2 = new CacheRequest ();
+			request1.Add (AutomationElement.NameProperty);
+			request2.Add (AutomationElement.ControlTypeProperty);
+
+			using (request1.Activate ()) {
+				Assert.AreEqual (request1, CacheRequest.Current, "request1 should be set to Current");
+				var button1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Button));
+
+				button1ElementRef2.Cached.Name.ToString ();
+
+				AssertRaises<InvalidOperationException> (
+					() => button1ElementRef2.Cached.ControlType.ToString (),
+					"checking for cached ControlTypeProperty, though it is not added to an active CacheRequest");
+
+				using (request2.Activate ()) {
+					Assert.AreEqual (request2, CacheRequest.Current, "request2 should be set to Current");
+					button1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+						new PropertyCondition (AEIds.ControlTypeProperty,
+							ControlType.Button));
+
+					AssertRaises<InvalidOperationException> (
+						() => button1ElementRef2.Cached.Name.ToString (),
+						"checking for cached NameProperty, when another CacheRequest has been activated");
+
+					button1ElementRef2.Cached.ControlType.ToString ();
+				}
+				Assert.AreEqual (request1, CacheRequest.Current, "request1 should be set to Current after request2 is disposed");
+
+				AssertRaises<InvalidOperationException> (
+					() => button1ElementRef2.Cached.Name.ToString (),
+					"checking for cached NameProperty, when another CacheRequest has been activated");
+
+				button1ElementRef2.Cached.ControlType.ToString ();
+
+				button1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Button));
+
+				button1ElementRef2.Cached.Name.ToString ();
+
+				AssertRaises<InvalidOperationException> (
+					() => button1ElementRef2.Cached.ControlType.ToString (),
+					"checking for cached ControlTypeProperty, it is not added to an active CacheRequest");
+			}
+			Assert.AreEqual (originalCurrent, CacheRequest.Current, "originalCurrent should be set to Current after request1 is disposed");
+
+			// No error with multiple calls to Dispose
+			var request3 = new CacheRequest ();
+			var disposable3 = request3.Activate ();
+			Assert.AreEqual (request3, CacheRequest.Current, "request3 should be set to Current after being activated");
+			disposable3.Dispose ();
+			Assert.AreEqual (originalCurrent, CacheRequest.Current, "originalCurrent should be set to Current after request3 is disposed");
+			disposable3.Dispose ();
+			Assert.AreEqual (originalCurrent, CacheRequest.Current, "originalCurrent should be set to Current after request3 is double-disposed");
+
+
+			// Test double-activation
+			// TODO: Disposal is out-of-order here, but not fully spec'd
+			IDisposable disposable2a = request2.Activate ();
+			Assert.AreEqual (request2, CacheRequest.Current, "request2 should be set to Current after being activated");
+			IDisposable disposable2b = request2.Activate ();
+			Assert.AreNotEqual (disposable2a, disposable2b, "Two activations of same request gives two different IDisposables");
+			Assert.AreEqual (request2, CacheRequest.Current, "request2 should be set to Current after being activated again");
+			disposable2a.Dispose ();
+			Assert.AreEqual (request2, CacheRequest.Current, "request2 should be set to Current after its first activation is disposed");
+
+			var button1ElementRef3 = testFormElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.Button));
+
+			Assert.AreEqual (button1Element.Current.ControlType,
+				button1ElementRef3.Cached.ControlType,
+				"When a request is activated twice, and the first activation is disposed, the second activation should still be active");
+			disposable2b.Dispose ();
+			Assert.AreEqual (originalCurrent, CacheRequest.Current, "originalCurrent should be set to Current after second request2 activation is disposed");
+		}
+
+		[Test]
+		public void ThreadingTest ()
+		{
+			CacheRequest originalRequest2 = null;
+			CacheRequest request2 = null;
+			CacheRequest current2a = null;
+			CacheRequest current2b = null;
+			CacheRequest current2c = null;
+			AutomationElement testFormElementRef2 = null;
+			EventWaitHandle ewh1 = new EventWaitHandle (false, EventResetMode.ManualReset);
+			EventWaitHandle ewh2 = new EventWaitHandle (false, EventResetMode.ManualReset);
+			bool threadComplete = false;
+
+			var t = new Thread (() => {
+				originalRequest2 = CacheRequest.Current;
+				request2 = new CacheRequest ();
+				request2.Add (AutomationElement.NameProperty);
+				request2.Push ();
+				current2a = CacheRequest.Current;
+				testFormElementRef2 = AutomationElement.RootElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ProcessIdProperty,
+						p.Id));
+				ewh1.Set ();
+				ewh2.WaitOne ();
+
+				current2b = CacheRequest.Current;
+				request2.Pop ();
+				current2c = CacheRequest.Current;
+				ewh2.Reset ();
+				ewh1.Set ();
+				ewh2.WaitOne ();
+
+				threadComplete = true;
+				ewh1.Set ();
+			});
+			t.Start ();
+			Assert.IsTrue (ewh1.WaitOne (500),
+				"Timed out waiting on thread");
+
+			Assert.AreSame (originalCurrent, originalRequest2,
+				"No matter the thread, all stacks have the same original request on bottom");
+			Assert.AreEqual (originalCurrent, CacheRequest.Current,
+				"Even though there is an active request on another thread, Current returns the original request on this thread");
+			Assert.AreEqual (request2, current2a,
+				"Current on the other thread returns an active request");
+			AssertRaises<InvalidOperationException> (
+				() => request2.Pop (),
+				"popping the active request from another thread");
+			AssertRaises<InvalidOperationException> (
+				() => request2.Add (AutomationElement.NameProperty),
+				"calling Add on active request from another thread");
+			request2.Push ();
+			request2.Pop ();
+
+			Assert.AreEqual (testFormElement.Current.Name,
+				testFormElementRef2.Cached.Name,
+				"Okay to use cached element from one thread in another thread");
+
+			var testFormElementRef3 = testFormElement.GetUpdatedCache (request2);
+			Assert.AreEqual (testFormElement.Current.Name,
+				testFormElementRef3.Cached.Name,
+				"Okay to call GetUpdatedCache using request from another thread");
+			testFormElementRef3 = AutomationElement.RootElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ProcessIdProperty,
+					p.Id));
+			AssertRaises<InvalidOperationException> (
+				() => testFormElementRef3.Cached.Name.ToString (),
+				"accessing cached property from element retrieved when only active CacheRequest was in another thread");
+
+			ewh1.Reset ();
+			ewh2.Set ();
+			Assert.IsTrue (ewh1.WaitOne (500),
+				"Timed out waiting on thread");
+
+			Assert.AreEqual (request2, current2b,
+				"Current on the thread unaffected by changes in this thread's request stack");
+			Assert.AreEqual (originalRequest2, current2c,
+				"Current on the thread goes back to the original request after active request popped");
+
+			Assert.IsFalse (threadComplete,
+				"Thread should not have completed at this point");
+			ewh1.Reset ();
+			ewh2.Set ();
+			Assert.IsTrue (ewh1.WaitOne (500),
+				"Timed out waiting on thread");
+			Assert.IsTrue (threadComplete,
+				"Thread should have completed at this point");
+		}
+
+		[Test]
+		public void CloneTest ()
+		{
+			var request = new CacheRequest ();
+			request.AutomationElementMode = AutomationElementMode.None;
+			request.TreeScope = TreeScope.Subtree;
+			request.TreeFilter = new PropertyCondition (AutomationElement.NameProperty, "test1");
+
+			var requestClone = request.Clone ();
+			Assert.AreEqual (request.AutomationElementMode, requestClone.AutomationElementMode, "AutomationElementMode");
+			Assert.AreEqual (request.TreeScope, requestClone.TreeScope, "TreeScope");
+			Assert.AreSame (request.TreeFilter, requestClone.TreeFilter, "TreeFilter instance should be shared between original and clone");
+
+			// TODO: Test that same things have been Add'ed
+		}
+
+		[Test]
+		public void AutomationElementModeTest ()
+		{
+			var request = new CacheRequest ();
+			Assert.AreEqual (AutomationElementMode.Full, request.AutomationElementMode, "Default AutomationElementMode value");
+
+			request.AutomationElementMode = AutomationElementMode.None;
+			request.Add (AutomationElement.NameProperty);
+
+			using (request.Activate ()) {
+				var groupBox1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Group));
+
+				Assert.AreEqual (groupBox1Element.Current.Name,
+					groupBox1ElementRef2.Cached.Name,
+					"Cached.Name should be available on Element");
+
+				// NOTE: Current is accessible, just not its properties
+				AssertRaises<InvalidOperationException> (
+					() => groupBox1ElementRef2.Current.Name.ToString (),
+					"accessing property from Current with AutomationElementMode.None");
+			}
+
+			request.Add (InvokePattern.Pattern);
+			request.Add (SelectionPattern.Pattern);
+			request.Add (SelectionPattern.SelectionProperty);
+			using (request.Activate ()) {
+				AutomationElement selectionElement = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Tree));
+			SelectionPattern selectionPattern = (SelectionPattern)
+				selectionElement.GetCachedPattern (
+					SelectionPattern.Pattern);
+				selectionPattern.Cached.GetSelection ();
+				AssertRaises<InvalidOperationException> (
+					() => selectionPattern.Cached.CanSelectMultiple.ToString (),
+					"Fetching a property that is not cached should throw InvalidOperationException");
+
+				AutomationElement invokeElement = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Button));
+			InvokePattern invokePattern = (InvokePattern)
+				invokeElement.GetCachedPattern (
+					InvokePattern.Pattern);
+				// LAMESPEC: Calling Invoke should throw exception
+				invokePattern.Invoke ();
+			}
+		}
+
+		[Test]
+		public void TreeFilterTest ()
+		{
+			var request = new CacheRequest ();
+			Assert.AreEqual (SWA.Automation.ControlViewCondition, request.TreeFilter,
+				"TreeFilter should default to ControlViewCondition");
+
+			request.Add (AutomationElement.NameProperty);
+			request.TreeScope = TreeScope.Subtree;
+
+			request.TreeFilter = new PropertyCondition (AutomationElement.ControlTypeProperty,
+				ControlType.Group);
+			using (request.Activate ()) {
+				var button1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Button));
+				Assert.IsNull (button1ElementRef2,
+					"AutomationElement.FindFirst should return null if element does not meet CacheRequest.TreeFilter");
+
+				var groupBox1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Group));
+				Assert.AreEqual (groupBox1ElementRef2.Current.Name,
+					groupBox1ElementRef2.Cached.Name,
+					"Cached.Name for element that does meet filter reqs");
+
+				// NOTE: This behavior seems very strange considering TreeScope
+				Assert.AreEqual (0, groupBox1ElementRef2.CachedChildren.Count,
+					"groupBox1 should have 0 CachedChildren, even though it has two children that meet CacheRequest.Filter");
+			}
+		}
+
+		[Test]
+		public void TreeScopeTest ()
+		{
+			var request = new CacheRequest ();
+			Assert.AreEqual (TreeScope.Element, request.TreeScope, "Default TreeScope value");
+
+			AssertRaises<ArgumentException> (
+				() => request.TreeScope = TreeScope.Ancestors,
+				"setting to TreeScope.Ancestors");
+
+			AssertRaises<ArgumentException> (
+				() => request.TreeScope = TreeScope.Parent,
+				"setting to TreeScope.Parent");
+
+			AssertRaises<ArgumentException> (
+				() => request.TreeScope = TreeScope.Element | TreeScope.Parent,
+				"setting to TreeScope.Element | TreeScope.Parent");
+
+			// TODO: Test Combined scopes that include parent/ancestors
+
+			// TODO: TreeScope.Descendants
+
+			request.Add (AutomationElement.NameProperty);
+
+			//TreeScope.Element
+			request.TreeScope = TreeScope.Element;
+			using (request.Activate ()) {
+				var groupBox1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Group));
+
+				Assert.AreEqual (groupBox1Element.Current.Name,
+					groupBox1ElementRef2.Cached.Name,
+					"Cached.Name should be available on Element");
+
+				AssertRaises<InvalidOperationException> (
+					() => groupBox1ElementRef2.CachedChildren.ToString (),
+					"accessing CachedChildren with TreeScope.Element");
+
+				AssertRaises<InvalidOperationException> (
+					() => groupBox1ElementRef2.CachedParent.ToString (),
+					"accessing CachedParent with TreeScope.Element");
+			}
+
+			//TreeScope.Children
+			request.TreeScope = TreeScope.Children;
+			using (request.Activate ()) {
+				var groupBox1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Group));
+
+				AssertRaises<InvalidOperationException> (
+					() => groupBox1ElementRef2.Cached.Name.ToString (),
+					"accessing cached property on fetched element with TreeScope.Children");
+
+				Assert.AreEqual (4, groupBox1ElementRef2.CachedChildren.Count, "CachedChildren.Count");
+				string [] expectedChildNames = { "groupBox3", "groupBox2", "button3", "button2" };
+				for (int i = 0; i < groupBox1ElementRef2.CachedChildren.Count; i++) {
+					AutomationElement childElement = groupBox1ElementRef2.CachedChildren [i];
+					Assert.AreEqual (expectedChildNames [i], childElement.Cached.Name,
+						"Cached.Name for child " + i.ToString ());
+					Assert.AreSame (groupBox1ElementRef2, childElement.CachedParent,
+						"groupbox1ElementRef2 and childElement.CachedParent should point to same instance");
+					// This fails because I guess CachedParent doesn't work too well when the parent wasn't included in the cache request
+					//Assert.AreEqual (groupBox1ElementRef2.Current.Name, childElement.CachedParent.Cached.Name,
+					//        "CachedParent should be available on CachedChildren");
+					// This fails because AutomationElement.Equals relies on on RuntimeId comparison that fails...or maybe it's the RuntimeId fetching that fails
+					//Assert.AreEqual (groupBox1ElementRef2, childElement.CachedParent,
+					//        "CachedParent should be available on CachedChildren");
+
+					AssertRaises<InvalidOperationException> (
+						() => childElement.CachedChildren.ToString (),
+						"accessing childElement.CachedChildren with TreeScope.Children");
+				}
+
+				AssertRaises<InvalidOperationException> (
+					() => groupBox1ElementRef2.CachedParent.ToString (),
+					"accessing CachedParent with TreeScope.Children");
+			}
+
+			//TreeScope.Subtree
+			request.TreeScope = TreeScope.Subtree;
+			using (request.Activate ()) {
+				var groupBox1ElementRef2 = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.ControlTypeProperty,
+						ControlType.Group));
+
+				Assert.AreEqual (groupBox1Element.Current.Name,
+					groupBox1ElementRef2.Cached.Name,
+					"Cached.Name should be available on Element with TreeScope.Subtree");
+
+				Assert.AreEqual (4, groupBox1ElementRef2.CachedChildren.Count, "CachedChildren.Count");
+				string [] expectedChildNames = { "groupBox3", "groupBox2", "button3", "button2" };
+				Dictionary<string, string []> expectedGrandchildNames = new Dictionary<string, string []> ();
+				expectedGrandchildNames ["groupBox3"] = new string [] { "button7", "button6" };
+				expectedGrandchildNames ["groupBox2"] = new string [] { "button5", "checkBox1", "button4" };
+				for (int i = 0; i < groupBox1ElementRef2.CachedChildren.Count; i++) {
+					AutomationElement childElement = groupBox1ElementRef2.CachedChildren [i];
+					Assert.AreEqual (expectedChildNames [i], childElement.Cached.Name,
+						"Cached.Name for child " + i.ToString ());
+					Assert.AreSame (groupBox1ElementRef2, childElement.CachedParent,
+						"groupbox1ElementRef2 and childElement.CachedParent should point to same instance");
+
+					if (expectedGrandchildNames.ContainsKey (expectedChildNames [i])) {
+						Assert.AreEqual (expectedGrandchildNames [expectedChildNames [i]].Length,
+							childElement.CachedChildren.Count,
+							"childElement.CachedChildren.Count for " + expectedChildNames [i]);
+						for (int j = 0; j < childElement.CachedChildren.Count; j++) {
+							AutomationElement gcElement = childElement.CachedChildren [j];
+							Assert.AreEqual (expectedGrandchildNames [expectedChildNames [i]] [j],
+								gcElement.Cached.Name,
+								"Cached.Name for grandchild " + i.ToString ());
+						}
+					} else {
+						Assert.AreEqual (0, childElement.CachedChildren.Count, "Childless elements should have empty CachedChildren");
+					}
+				}
+
+				AssertRaises<InvalidOperationException> (
+					() => groupBox1ElementRef2.CachedParent.ToString (),
+					"accessing CachedParent with TreeScope.Subtree");
+			}
+		}
+
+		[Test]
+		public void GetUpdatedCacheTest ()
+		{
+			AssertRaises<ArgumentNullException> (
+				() => button1Element.GetUpdatedCache (null),
+				"passing null to GetUpdatedCache");
+
+			var request = new CacheRequest ();
+
+			var updatedElement = button1Element.GetUpdatedCache (request);
+			AssertRaises<InvalidOperationException> (
+				() => updatedElement.Cached.Name.ToString (),
+				"trying to access cached property on element returned by GetUpdatedCache, when no properties were specified in CacheRequest");
+
+			request.Add (AutomationElement.NameProperty);
+
+			updatedElement = button1Element.GetUpdatedCache (request);
+			Assert.AreEqual (button1Element.Current.Name,
+				updatedElement.Cached.Name,
+				"updatedElement Cached.Name should be the same as Current.Name if request has NameProperty set, even if it has not been activated yet");
+
+			AutomationElement button1ElementRef2;
+			using (request.Activate ()) {
+				button1ElementRef2 = button1Element.GetUpdatedCache (request);
+			}
+
+			Assert.AreEqual (button1Element.Current.Name,
+				button1ElementRef2.Current.Name,
+				"Both references to button1Element should have the same Current.Name");
+
+			Assert.AreEqual (button1Element.Current.Name,
+				button1ElementRef2.Cached.Name,
+				"button1Element Cached.Name should be the same as Current.Name");
+
+			AssertRaises<InvalidOperationException> (
+				() => button1Element.Cached.Name.ToString (),
+				"trying to access cache on original element instance after GetUpdatedCache is called");
+
+			updatedElement = button1Element.GetUpdatedCache (request);
+			Assert.AreEqual (button1Element.Current.Name,
+				updatedElement.Cached.Name,
+				"updatedElement Cached.Name should be the same as Current.Name if request has NameProperty set, even if it is no longer active");
+		}
+
+		[Test]
+		public void PopCurrentAndExceptionTest ()
+		{
+			var request1 = new CacheRequest ();
+			var request2 = new CacheRequest ();
+
+			// NOTE: It appears that at the bottom of the CacheRequest
+			//       stack is an inactive request with bizarre behavior:
+			// TODO: Test if any properties or patterns have been added to originalCurrent
+
+			// Verify that originalCurrent has all the default CacheRequest settings
+			Assert.AreEqual (AutomationElementMode.Full, originalCurrent.AutomationElementMode,
+				"Original Current.AutomationElementMode");
+			Assert.AreEqual (TreeScope.Element, originalCurrent.TreeScope,
+				"Original Current.TreeScope");
+			Assert.AreEqual (SWA.Automation.ControlViewCondition, originalCurrent.TreeFilter,
+				"Original Current.TreeFilter");
+
+			// Cannot pop originalCurrent, even though it is not really active
+			AssertRaises<InvalidOperationException> (
+				() => originalCurrent.Pop (),
+				"popping original Current");
+
+			AssertRaises<InvalidOperationException> (
+				() => request1.Pop (),
+				"popping inactive CacheRequest");
+
+			request1.Push ();
+			Assert.AreEqual (request1, CacheRequest.Current, "CacheRequest.Current should be equal to request at top of stack");
+			request2.Push ();
+			Assert.AreEqual (request2, CacheRequest.Current, "CacheRequest.Current should be equal to request at top of stack");
+
+			// A request can occupy multiple slots in the request stack
+			request2.Push ();
+			Assert.AreEqual (request2, CacheRequest.Current, "CacheRequest.Current should be equal to request at top of stack");
+			request1.Push ();
+			Assert.AreEqual (request1, CacheRequest.Current, "CacheRequest.Current should be equal to request at top of stack");
+			request1.Pop ();
+			Assert.AreEqual (request2, CacheRequest.Current, "CacheRequest.Current should be equal to request at top of stack");
+			request2.Pop ();
+			Assert.AreEqual (request2, CacheRequest.Current, "CacheRequest.Current should be equal to request at top of stack");
+
+			AssertRaises<InvalidOperationException> (
+				() => request1.Pop (),
+				"popping active CacheRequest not at top of stack");
+
+			request2.Pop ();
+			Assert.AreEqual (request1, CacheRequest.Current, "CacheRequest.Current should be equal to request at top of stack");
+			request1.Pop ();
+			Assert.AreEqual (originalCurrent, CacheRequest.Current, "After deactivating all of our requests, original Current should be back");
+
+			// Neat
+			request1.Activate ();
+			Assert.AreEqual (request1, CacheRequest.Current, "CacheRequest.Current should be equal to request at top of stack");
+			request1.Pop ();
+			Assert.AreEqual (originalCurrent, CacheRequest.Current, "After deactivating all of our requests, original Current should be back");
+		}
+
+		// This behavior seems strange:
+		//       "Caching also occurs when you subscribe to an event while a CacheRequest is active.
+		//        The AutomationElement passed to your event handler as the source of an event contains
+		//        the cached properties and patterns specified by the original CacheRequest. Any changes
+		//        made to the CacheRequest after you subscribe to the event have no effect."
+		[Test]
+		public void PropertyEventTest ()
+		{
+			string oldName = label1Element.Current.Name;
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.NameProperty);
+			eventCount = 0;
+
+			// Test adding handler before activating cache
+			At.AddAutomationPropertyChangedEventHandler (
+				testFormElement,
+				TreeScope.Children,
+				PropertyChangedHandler,
+				AEIds.NameProperty);
+			using (request.Activate ()) {
+				RunCommand ("click button1");
+				Assert.AreNotEqual (0, eventCount, "Event not fired");
+				Assert.AreNotEqual (eventElement.Current.Name,
+					oldName,
+					"Name has changed");
+				AssertRaises<InvalidOperationException> (
+					() => eventElement.Cached.Name.ToString (),
+					"Cached name when handler added before the cache was activated");
+			}
+			At.RemoveAutomationPropertyChangedEventHandler (label1Element,
+				PropertyChangedHandler);
+
+			oldName = label1Element.Current.Name;
+			eventCount = 0;
+
+			// Test adding handler after activating cache
+			using (request.Activate ()) {
+				At.AddAutomationPropertyChangedEventHandler (
+					label1Element,
+					TreeScope.Element,
+					PropertyChangedHandler,
+					AEIds.NameProperty);
+				RunCommand ("click button1");
+				Assert.AreNotEqual (0, eventCount, "Event not fired");
+				Assert.AreNotEqual (eventElement.Current.Name,
+					oldName,
+				"Name has changed");
+				AssertRaises<InvalidOperationException> (
+					() => eventElement.Cached.Name.ToString (),
+					"Cached name when handler added after the cache was activated");
+				At.RemoveAutomationPropertyChangedEventHandler (label1Element,
+					PropertyChangedHandler);
+			}
+
+			// Test using Push() rather than Activate()
+			request.Push ();
+			eventCount = 0;
+			At.AddAutomationPropertyChangedEventHandler (
+				label1Element,
+				TreeScope.Element,
+				PropertyChangedHandler,
+				AEIds.NameProperty);
+			RunCommand ("click button1");
+			Assert.AreNotEqual (0, eventCount, "Event not fired");
+			Assert.AreNotEqual (eventElement.Current.Name,
+				oldName,
+			"Name has changed");
+			AssertRaises<InvalidOperationException> (
+				() => eventElement.Cached.Name.ToString (),
+				"Cached name when handler added after the cache was activated");
+			At.RemoveAutomationPropertyChangedEventHandler (label1Element,
+				PropertyChangedHandler);
+			request.Pop ();
+		}
+
+		[Test]
+		public void SelectionTest ()
+		{
+			AutomationElement child1Element, child2Element;
+			child1Element = treeView1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.TreeItem));
+			Assert.IsNotNull (child1Element, "Child element should not be null");
+			child2Element = TreeWalker.RawViewWalker.GetNextSibling (child1Element);
+			Assert.IsNotNull (child2Element, "Child element should not be null");
+			CacheRequest request = new CacheRequest ();
+			request.Add (SelectionItemPattern.Pattern);
+			request.Add (SelectionItemPattern.IsSelectedProperty);
+			request.Add (SelectionItemPattern.SelectionContainerProperty);
+			request.Add (SelectionPattern.Pattern);
+			request.Add (SelectionPattern.CanSelectMultipleProperty);
+			request.Add (SelectionPattern.IsSelectionRequiredProperty);
+			request.Add (SelectionPattern.SelectionProperty);
+
+			using (request.Activate ()) {
+			SelectionItemPattern CachedItemPattern;
+				AssertRaises<InvalidOperationException> (
+					() => CachedItemPattern = (SelectionItemPattern)
+						child2Element.GetCachedPattern (
+							SelectionItemPattern.Pattern),
+						"GetCachedPattern when fetched from an element retrieved while there was no active cache");
+
+				child2Element = child2Element.GetUpdatedCache (request);
+				CachedItemPattern = (SelectionItemPattern)
+					child2Element.GetCachedPattern (
+						SelectionItemPattern.Pattern);
+				SelectionItemPattern currentItemPattern = (SelectionItemPattern)
+					child2Element.GetCurrentPattern (
+						SelectionItemPattern.Pattern);
+				AutomationElement treeView1ElementRef2 = treeView1Element.GetUpdatedCache (request);
+				SelectionPattern currentSelectionPattern = (SelectionPattern)
+					treeView1ElementRef2.GetCurrentPattern (
+						SelectionPattern.Pattern);
+
+				Assert.IsFalse (CachedItemPattern.Current.IsSelected);
+				Assert.IsFalse (CachedItemPattern.Cached.IsSelected);
+				Assert.IsFalse (currentItemPattern.Current.IsSelected);
+				AssertRaises<InvalidOperationException> (
+					() => currentItemPattern.Cached.IsSelected.ToString (),
+					"Cached property on an uncached pattern");
+
+				Assert.AreEqual (treeView1Element,
+					CachedItemPattern.Cached.SelectionContainer,
+					"Cached.SelectionContainer");
+				VerifyCachedPropertyValue (child2Element,
+					SelectionItemPattern.SelectionContainerProperty,
+					currentItemPattern.Current.SelectionContainer,
+					currentItemPattern.Current.SelectionContainer,
+					currentItemPattern.Current.SelectionContainer);
+				Assert.IsFalse (currentSelectionPattern.Current.IsSelectionRequired,
+					"IsSelectionRequired before select");
+
+				CachedItemPattern.Select ();
+				Thread.Sleep (500);
+
+				Assert.IsTrue (currentSelectionPattern.Current.IsSelectionRequired,
+					"IsSelectionRequired before select");
+				Assert.IsTrue (currentItemPattern.Current.IsSelected);
+				Assert.IsTrue (CachedItemPattern.Current.IsSelected);
+				Assert.IsFalse (CachedItemPattern.Cached.IsSelected);
+
+			SelectionPattern cachedSelectionPattern
+				= (SelectionPattern) treeView1ElementRef2.GetCachedPattern (SelectionPattern.Pattern);
+
+				Assert.AreEqual (cachedSelectionPattern.Cached.CanSelectMultiple,
+					currentSelectionPattern.Current.CanSelectMultiple,
+					"Cached.CanSelectMultiple == Current.CanSelectMultiple");
+				VerifyCachedPropertyValue (treeView1ElementRef2,
+					SelectionPatternIdentifiers.CanSelectMultipleProperty,
+					currentSelectionPattern.Current.CanSelectMultiple,
+					currentSelectionPattern.Current.CanSelectMultiple,
+					currentSelectionPattern.Current.CanSelectMultiple);
+
+				Assert.IsFalse (cachedSelectionPattern.Cached.IsSelectionRequired,
+					"Cached.IsSelectionRequired == Current.IsSelectionRequired");
+				VerifyCachedPropertyValue (treeView1ElementRef2,
+					SelectionPatternIdentifiers.IsSelectionRequiredProperty,
+					false, false, false);
+
+				AutomationElement [] selection = cachedSelectionPattern.Current.GetSelection ();
+				Assert.AreEqual (1, selection.Length, "Selection length");
+
+				selection = cachedSelectionPattern.Cached.GetSelection ();
+				Assert.AreEqual (0, selection.Length, "Selection length");
+			}
+		}
+
+		[Test]
+		public void TextPatternTest ()
+		{
+			RunCommand ("set textbox3 to first line:second line:third line");
+			var request = new CacheRequest ();
+			request.Add (TextPattern.Pattern);
+			using (request.Activate ()) {
+				TextPattern textPattern;
+				AutomationElement textbox3ElementRef2 = textbox3Element.GetUpdatedCache (request);
+				AssertRaises<InvalidOperationException> (
+					() => textPattern = (TextPattern) textbox3Element.GetCachedPattern (TextPattern.Pattern),
+					"Getting TextPattern from an uncached ref");
+				textPattern = (TextPattern) textbox3ElementRef2.GetCachedPattern (TextPattern.Pattern);
+				TextPatternRange range = textPattern.DocumentRange.Clone ();
+				TextPatternRange range1;
+
+				range1 = range.FindText ("second", false, false);
+				Assert.AreEqual ("second", range1.GetText (-1));
+
+				RunCommand ("set textbox3 to gomez thing:morticia\twednesday ing");
+				Thread.Sleep (500);
+
+				range1 = range.FindText ("mort", false, false);
+				Assert.AreEqual ("mort", range1.GetText (-1));
+			}
+		}
+
+		[Test]
+		public void AcceleratorKeyTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.AcceleratorKeyProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.AcceleratorKey,
+					groupBox1Element.Current.AcceleratorKey,
+					"Cached.AcceleratorKey == Current.AcceleratorKey");
+			}
+		}
+
+		[Test]
+		public void AccessKeyTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.AccessKeyProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.AccessKey,
+					groupBox1Element.Current.AccessKey,
+					"Cached.AccessKey == Current.AccessKey");
+			}
+		}
+
+		[Test]
+		public void AutomationIdTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.AutomationIdProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.AutomationId,
+					groupBox1Element.Current.AutomationId,
+					"Cached.AutomationId == Current.AutomationId");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.AutomationIdProperty,
+					groupBox1Element.Current.AutomationId,
+					groupBox1Element.Current.AutomationId,
+					groupBox1Element.Current.AutomationId);
+			}
+		}
+
+		[Test]
+		public void BoundingRectangleTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.BoundingRectangleProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.BoundingRectangle,
+					groupBox1Element.Current.BoundingRectangle,
+					"Cached.BoundingRectangle == Current.BoundingRectangle");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.BoundingRectangleProperty,
+					groupBox1Element.Current.BoundingRectangle,
+					groupBox1Element.Current.BoundingRectangle,
+					groupBox1Element.Current.BoundingRectangle);
+			}
+		}
+
+		[Test]
+		public void ClassNameTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.ClassNameProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.ClassName,
+					groupBox1Element.Current.ClassName,
+					"Cached.ClassName == Current.ClassName");
+				Assert.AreEqual (groupBox1ElementRef2.Cached.ClassName,
+					groupBox1ElementRef2.GetCachedPropertyValue (AutomationElement.ClassNameProperty),
+					"GetCachedPropertyValue");
+			}
+		}
+
+		[Test]
+		public void ClickablePointTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.ClickablePointProperty);
+		}
+
+		[Test]
+		public void ControlTypeTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.ControlTypeProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.ControlType,
+					groupBox1Element.Current.ControlType,
+					"Cached.ControlType == Current.ControlType");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.ControlTypeProperty,
+					groupBox1Element.Current.ControlType,
+					groupBox1Element.Current.ControlType,
+					groupBox1Element.Current.ControlType);
+			}
+		}
+
+		[Test]
+		public void CultureTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.CultureProperty);
+		}
+
+		[Test]
+		public void FrameworkIdTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.FrameworkIdProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.FrameworkId,
+					groupBox1Element.Current.FrameworkId,
+					"Cached.FrameworkId == Current.FrameworkId");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.FrameworkIdProperty,
+					groupBox1Element.Current.FrameworkId,
+					groupBox1Element.Current.FrameworkId,
+					groupBox1Element.Current.FrameworkId);
+			}
+		}
+
+		[Test]
+		public void HasKeyboardFocusTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.HasKeyboardFocusProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.HasKeyboardFocus,
+					groupBox1Element.Current.HasKeyboardFocus,
+					"Cached.HasKeyboardFocus == Current.HasKeyboardFocus");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.HasKeyboardFocusProperty,
+					groupBox1Element.Current.HasKeyboardFocus,
+					groupBox1Element.Current.HasKeyboardFocus,
+					groupBox1Element.Current.HasKeyboardFocus);
+			}
+		}
+
+		[Test]
+		public void HelpTextTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.HelpTextProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.HelpText,
+					groupBox1Element.Current.HelpText,
+					"Cached.HelpText == Current.HelpText");
+				Assert.AreEqual (groupBox1ElementRef2.Cached.HelpText,
+					groupBox1ElementRef2.GetCachedPropertyValue (AutomationElement.HelpTextProperty),
+					"GetCachedPropertyValue");
+			}
+		}
+
+		[Test]
+		public void IsContentElementTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.IsContentElementProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.IsContentElement,
+					groupBox1Element.Current.IsContentElement,
+					"Cached.IsContentElement == Current.IsContentElement");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.IsContentElementProperty,
+					groupBox1Element.Current.IsContentElement,
+					groupBox1Element.Current.IsContentElement,
+					groupBox1Element.Current.IsContentElement);
+			}
+		}
+
+		[Test]
+		public void IsControlElementTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.IsControlElementProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.IsControlElement,
+					groupBox1Element.Current.IsControlElement,
+					"Cached.IsControlElement == Current.IsControlElement");
+				Assert.AreEqual (groupBox1ElementRef2.Cached.IsControlElement,
+					groupBox1ElementRef2.GetCachedPropertyValue (AutomationElement.IsControlElementProperty),
+					"GetCachedPropertyValue");
+			}
+		}
+
+		[Test]
+		public void IsDockPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsDockPatternAvailableProperty);
+		}
+
+		public void IsEnableTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.IsEnabledProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.IsEnabled,
+					groupBox1Element.Current.IsEnabled,
+					"Cached.IsEnabled == Current.IsEnabled");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.IsEnabledProperty,
+					groupBox1Element.Current.IsEnabled,
+					groupBox1Element.Current.IsEnabled,
+					groupBox1Element.Current.IsEnabled);
+			}
+		}
+
+		[Test]
+		public void IsExpandCollapsePatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsExpandCollapsePatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsGridItemPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsGridItemPatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsGridPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsGridPatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsInvokePatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsInvokePatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsKeyboardFocusableTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.IsKeyboardFocusableProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.IsKeyboardFocusable,
+					groupBox1Element.Current.IsKeyboardFocusable,
+					"Cached.IsKeyboardFocusable == Current.IsKeyboardFocusable");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.IsKeyboardFocusableProperty,
+					groupBox1Element.Current.IsKeyboardFocusable,
+					groupBox1Element.Current.IsKeyboardFocusable,
+					groupBox1Element.Current.IsKeyboardFocusable);
+			}
+		}
+
+		[Test]
+		public void IsMultipleViewPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsMultipleViewPatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsOffscreenTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.IsOffscreenProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.IsOffscreen,
+					groupBox1Element.Current.IsOffscreen,
+					"Cached.IsOffscreen == Current.IsOffscreen");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.IsOffscreenProperty,
+					groupBox1Element.Current.IsOffscreen,
+					groupBox1Element.Current.IsOffscreen,
+					groupBox1Element.Current.IsOffscreen);
+			}
+		}
+
+		[Test]
+		public void IsPasswordTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.IsPasswordProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.IsPassword,
+					groupBox1Element.Current.IsPassword,
+					"Cached.IsPassword == Current.IsPassword");
+				Assert.AreEqual (groupBox1ElementRef2.Cached.IsPassword,
+					groupBox1ElementRef2.GetCachedPropertyValue (AutomationElement.IsPasswordProperty),
+					"GetCachedPropertyValue");
+			}
+		}
+
+		[Test]
+		public void IsRangeValuePatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsRangeValuePatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsRequiredForFormTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.IsRequiredForFormProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.IsRequiredForForm,
+					groupBox1Element.Current.IsRequiredForForm,
+					"Cached.IsRequiredForForm == Current.IsRequiredForForm");
+				Assert.AreEqual (groupBox1ElementRef2.Cached.IsRequiredForForm,
+					groupBox1ElementRef2.GetCachedPropertyValue (AutomationElement.IsRequiredForFormProperty),
+					"GetCachedPropertyValue");
+			}
+		}
+
+		[Test]
+		public void IsScrollItemPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsScrollItemPatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsScrollPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsScrollPatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsSelectionItemPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsSelectionItemPatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsSelectionPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsSelectionPatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsTableItemPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsTableItemPatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsTablePatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsTablePatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsTextPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsTextPatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsTogglePatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsTogglePatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsTransformPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsTransformPatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsValuePatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsValuePatternAvailableProperty);
+		}
+
+		[Test]
+		public void IsWindowPatternAvailableTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.IsWindowPatternAvailableProperty);
+		}
+
+		[Test]
+		public void ItemStatusTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.ItemStatusProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.ItemStatus,
+					groupBox1Element.Current.ItemStatus,
+					"Cached.ItemStatus == Current.ItemStatus");
+				Assert.AreEqual (groupBox1ElementRef2.Cached.ItemStatus,
+					groupBox1ElementRef2.GetCachedPropertyValue (AutomationElement.ItemStatusProperty),
+					"GetCachedPropertyValue");
+			}
+		}
+
+		[Test]
+		public void ItemTypeTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.ItemTypeProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.ItemType,
+					groupBox1Element.Current.ItemType,
+					"Cached.ItemType == Current.ItemType");
+				Assert.AreEqual (groupBox1ElementRef2.Cached.ItemType,
+					groupBox1ElementRef2.GetCachedPropertyValue (AutomationElement.ItemTypeProperty),
+					"GetCachedPropertyValue");
+			}
+		}
+
+		[Test]
+		public void LabeledByTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.LabeledByProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.LabeledBy,
+					groupBox1Element.Current.LabeledBy,
+					"Cached.LabeledBy == Current.LabeledBy");
+				Assert.AreEqual (groupBox1ElementRef2.Cached.LabeledBy,
+					groupBox1ElementRef2.GetCachedPropertyValue (AutomationElement.LabeledByProperty),
+					"GetCachedPropertyValue");
+			}
+		}
+
+		[Test]
+		public void LocalizedControlTypeTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.LocalizedControlTypeProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.LocalizedControlType,
+					groupBox1Element.Current.LocalizedControlType,
+					"Cached.LocalizedControlType == Current.LocalizedControlType");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.LocalizedControlTypeProperty,
+					groupBox1Element.Current.LocalizedControlType,
+					groupBox1Element.Current.LocalizedControlType,
+					groupBox1Element.Current.LocalizedControlType);
+			}
+		}
+
+		// name is implicitly tested elsewhere
+
+		[Test]
+		public void NativeWindowHandleTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.NativeWindowHandleProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.NativeWindowHandle,
+					groupBox1Element.Current.NativeWindowHandle,
+					"Cached.NativeWindowHandle == Current.NativeWindowHandle");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.NativeWindowHandleProperty,
+					groupBox1Element.Current.NativeWindowHandle,
+					groupBox1Element.Current.NativeWindowHandle,
+					groupBox1Element.Current.NativeWindowHandle);
+			}
+		}
+
+		[Test]
+		public void OrientationTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.OrientationProperty);
+			using (request.Activate ()) {
+				AutomationElement hScrollBarElementRef2 = hScrollBarElement.GetUpdatedCache (request);
+				Assert.AreEqual (hScrollBarElementRef2.Cached.Orientation,
+					hScrollBarElement.Current.Orientation,
+					"Cached.Orientation == Current.Orientation");
+				VerifyCachedPropertyValue (hScrollBarElementRef2,
+					AEIds.OrientationProperty,
+					hScrollBarElement.Current.Orientation,
+					hScrollBarElement.Current.Orientation,
+					hScrollBarElement.Current.Orientation);
+			}
+		}
+
+		[Test]
+		public void ProcessIdTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (AutomationElement.ProcessIdProperty);
+			using (request.Activate ()) {
+				AutomationElement groupBox1ElementRef2 = groupBox1Element.GetUpdatedCache (request);
+				Assert.AreEqual (groupBox1ElementRef2.Cached.ProcessId,
+					groupBox1Element.Current.ProcessId,
+					"Cached.ProcessId == Current.ProcessId");
+				VerifyCachedPropertyValue (groupBox1ElementRef2,
+					AEIds.ProcessIdProperty,
+					groupBox1Element.Current.ProcessId,
+					groupBox1Element.Current.ProcessId,
+					groupBox1Element.Current.ProcessId);
+			}
+		}
+
+		[Test]
+		public void RuntimeIdTest ()
+		{
+			TestSimpleProperty (groupBox1Element,
+				AutomationElement.RuntimeIdProperty);
+		}
+
+		[Test]
+		public void ExpandCollapsePatternTest ()
+		{
+			AutomationElement parentElement
+				= treeView1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.TreeItem));
+			var request = new CacheRequest ();
+			request.Add (ExpandCollapsePattern.Pattern);
+			request.Add (ExpandCollapsePattern.ExpandCollapseStateProperty);
+
+			using (request.Activate ()) {
+				AutomationElement parentElementRef2 = parentElement.GetUpdatedCache (request);
+				ExpandCollapsePattern cachedPattern = (ExpandCollapsePattern) parentElementRef2.GetCachedPattern (ExpandCollapsePattern.Pattern);
+				ExpandCollapsePattern currentPattern = (ExpandCollapsePattern) parentElement.GetCurrentPattern (ExpandCollapsePattern.Pattern);
+				Assert.AreEqual (cachedPattern.Cached.ExpandCollapseState,
+					currentPattern.Current.ExpandCollapseState,
+					"Cached.ExpandCollapseState == Current.ExpandCollapseState");
+				VerifyCachedPropertyValue (parentElementRef2,
+					ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty,
+					currentPattern.Current.ExpandCollapseState,
+					currentPattern.Current.ExpandCollapseState,
+					currentPattern.Current.ExpandCollapseState);
+			}
+		}
+				
+		[Test]
+		public void MultipleViewPatternTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (MultipleViewPattern.Pattern);
+			request.Add (MultipleViewPattern.CurrentViewProperty);
+
+			using (request.Activate ()) {
+				AutomationElement listView1ElementRef2 = listView1Element.GetUpdatedCache (request);
+				MultipleViewPattern cachedPattern = (MultipleViewPattern) listView1ElementRef2.GetCachedPattern (MultipleViewPattern.Pattern);
+				MultipleViewPattern currentPattern = (MultipleViewPattern) listView1Element.GetCurrentPattern (MultipleViewPattern.Pattern);
+				Assert.AreEqual (cachedPattern.Cached.CurrentView,
+					currentPattern.Current.CurrentView,
+					"Cached.CurrentView == Current.CurrentView");
+				VerifyCachedPropertyValue (listView1ElementRef2,
+					MultipleViewPatternIdentifiers.CurrentViewProperty,
+					currentPattern.Current.CurrentView,
+					currentPattern.Current.CurrentView,
+					currentPattern.Current.CurrentView);
+			}
+		}
+				
+		[Test]
+		public void TogglePatternTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (TogglePattern.Pattern);
+			request.Add (TogglePattern.ToggleStateProperty);
+
+			using (request.Activate ()) {
+				AutomationElement checkBox1ElementRef2 = checkBox1Element.GetUpdatedCache (request);
+				TogglePattern cachedPattern = (TogglePattern) checkBox1ElementRef2.GetCachedPattern (TogglePattern.Pattern);
+				Assert.AreEqual (ToggleState.Off,
+					checkBox1Element.GetCurrentPropertyValue (TogglePatternIdentifiers.ToggleStateProperty),
+					"CheckBox is initially not checked");
+				Assert.AreEqual (ToggleState.Off,
+					checkBox1ElementRef2.GetCachedPropertyValue (TogglePatternIdentifiers.ToggleStateProperty),
+					"CheckBox initial cached state");
+				Assert.AreEqual (ToggleState.Off,
+					cachedPattern.Cached.ToggleState,
+					"cached.ToggleState");
+
+				cachedPattern.Toggle ();
+				Assert.AreEqual (ToggleState.On,
+					checkBox1Element.GetCurrentPropertyValue (TogglePatternIdentifiers.ToggleStateProperty),
+					"CheckBox is now checked");
+				Assert.AreEqual (ToggleState.Off,
+					checkBox1ElementRef2.GetCachedPropertyValue (TogglePatternIdentifiers.ToggleStateProperty),
+					"CheckBox cached state after toggle");
+				Assert.AreEqual (ToggleState.Off,
+					cachedPattern.Cached.ToggleState,
+					"cached.ToggleState after toggle");
+			}
+		}
+				
+		[Test]
+		public void RangeValuePatternTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (RangeValuePattern.Pattern);
+			request.Add (RangeValuePattern.IsReadOnlyProperty);
+			request.Add (RangeValuePattern.LargeChangeProperty);
+			request.Add (RangeValuePattern.MaximumProperty);
+			request.Add (RangeValuePattern.MinimumProperty);
+			request.Add (RangeValuePattern.SmallChangeProperty);
+			request.Add (RangeValuePattern.ValueProperty);
+
+			using (request.Activate ()) {
+				AutomationElement hScrollBarElementRef2 = hScrollBarElement.GetUpdatedCache (request);
+				RangeValuePattern currentPattern = (RangeValuePattern) hScrollBarElement.GetCurrentPattern (RangeValuePattern.Pattern);
+				RangeValuePattern cachedPattern = (RangeValuePattern) hScrollBarElementRef2.GetCachedPattern (RangeValuePattern.Pattern);
+
+				Assert.AreEqual (cachedPattern.Cached.IsReadOnly,
+					currentPattern.Current.IsReadOnly,
+					"Cached.IsReadOnly == Current.IsReadOnly");
+				VerifyCachedPropertyValue (hScrollBarElementRef2,
+					RangeValuePatternIdentifiers.IsReadOnlyProperty,
+					currentPattern.Current.IsReadOnly,
+					currentPattern.Current.IsReadOnly,
+					currentPattern.Current.IsReadOnly);
+
+				Assert.AreEqual (cachedPattern.Cached.LargeChange,
+					currentPattern.Current.LargeChange,
+					"Cached.LargeChange == Current.LargeChange");
+				VerifyCachedPropertyValue (hScrollBarElementRef2,
+					RangeValuePatternIdentifiers.LargeChangeProperty,
+					currentPattern.Current.LargeChange,
+					currentPattern.Current.LargeChange,
+					currentPattern.Current.LargeChange);
+
+				Assert.AreEqual (cachedPattern.Cached.Maximum,
+					currentPattern.Current.Maximum,
+					"Cached.Maximum == Current.Maximum");
+				VerifyCachedPropertyValue (hScrollBarElementRef2,
+					RangeValuePatternIdentifiers.MaximumProperty,
+					currentPattern.Current.Maximum,
+					currentPattern.Current.Maximum,
+					currentPattern.Current.Maximum);
+
+				Assert.AreEqual (cachedPattern.Cached.Minimum,
+					currentPattern.Current.Minimum,
+					"Cached.Minimum == Current.Minimum");
+				VerifyCachedPropertyValue (hScrollBarElementRef2,
+					RangeValuePatternIdentifiers.MinimumProperty,
+					currentPattern.Current.Minimum,
+					currentPattern.Current.Minimum,
+					currentPattern.Current.Minimum);
+
+				Assert.AreEqual (cachedPattern.Cached.SmallChange,
+					currentPattern.Current.SmallChange,
+					"Cached.SmallChange == Current.SmallChange");
+				VerifyCachedPropertyValue (hScrollBarElementRef2,
+					RangeValuePatternIdentifiers.SmallChangeProperty,
+					currentPattern.Current.SmallChange,
+					currentPattern.Current.SmallChange,
+					currentPattern.Current.SmallChange);
+
+				Assert.AreEqual (cachedPattern.Cached.Value,
+					currentPattern.Current.Value,
+					"Cached.Value == Current.Value");
+				VerifyCachedPropertyValue (hScrollBarElementRef2,
+					RangeValuePatternIdentifiers.ValueProperty,
+					currentPattern.Current.Value,
+					currentPattern.Current.Value,
+					currentPattern.Current.Value);
+			}
+		}
+				
+		[Test]
+		public void ScrollPatternTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (ScrollPattern.Pattern);
+			request.Add (ScrollPattern.HorizontallyScrollableProperty);
+			request.Add (ScrollPattern.HorizontalScrollPercentProperty);
+			request.Add (ScrollPattern.HorizontalViewSizeProperty);
+			request.Add (ScrollPattern.VerticallyScrollableProperty);
+			request.Add (ScrollPattern.VerticalViewSizeProperty);
+
+			using (request.Activate ()) {
+				AutomationElement listView1ElementRef2 = listView1Element.GetUpdatedCache (request);
+				ScrollPattern currentPattern = (ScrollPattern) listView1Element.GetCurrentPattern (ScrollPattern.Pattern);
+				ScrollPattern cachedPattern = (ScrollPattern) listView1ElementRef2.GetCachedPattern (ScrollPattern.Pattern);
+
+				Assert.AreEqual (cachedPattern.Cached.HorizontallyScrollable,
+					currentPattern.Current.HorizontallyScrollable,
+					"Cached.HorizontallyScrollable == Current.HorizontallyScrollable");
+				VerifyCachedPropertyValue (listView1ElementRef2,
+					ScrollPatternIdentifiers.HorizontallyScrollableProperty,
+					currentPattern.Current.HorizontallyScrollable,
+					currentPattern.Current.HorizontallyScrollable,
+					currentPattern.Current.HorizontallyScrollable);
+
+				Assert.AreEqual (cachedPattern.Cached.HorizontalScrollPercent,
+					currentPattern.Current.HorizontalScrollPercent,
+					"Cached.HorizontalScrollPercent == Current.HorizontalScrollPercent");
+				VerifyCachedPropertyValue (listView1ElementRef2,
+					ScrollPatternIdentifiers.HorizontalScrollPercentProperty,
+					currentPattern.Current.HorizontalScrollPercent,
+					currentPattern.Current.HorizontalScrollPercent,
+					currentPattern.Current.HorizontalScrollPercent);
+
+				Assert.AreEqual (cachedPattern.Cached.HorizontalViewSize,
+					currentPattern.Current.HorizontalViewSize,
+					"Cached.HorizontalViewSize == Current.HorizontalViewSize");
+				VerifyCachedPropertyValue (listView1ElementRef2,
+					ScrollPatternIdentifiers.HorizontalViewSizeProperty,
+					currentPattern.Current.HorizontalViewSize,
+					currentPattern.Current.HorizontalViewSize,
+					currentPattern.Current.HorizontalViewSize);
+
+				Assert.AreEqual (cachedPattern.Cached.VerticallyScrollable,
+					currentPattern.Current.VerticallyScrollable,
+					"Cached.VerticallyScrollable == Current.VerticallyScrollable");
+				VerifyCachedPropertyValue (listView1ElementRef2,
+					ScrollPatternIdentifiers.VerticallyScrollableProperty,
+					currentPattern.Current.VerticallyScrollable,
+					currentPattern.Current.VerticallyScrollable,
+					currentPattern.Current.VerticallyScrollable);
+
+				Assert.AreEqual (cachedPattern.Cached.VerticalViewSize,
+					currentPattern.Current.VerticalViewSize,
+					"Cached.VerticalViewSize == Current.VerticalViewSize");
+				VerifyCachedPropertyValue (listView1ElementRef2,
+					ScrollPatternIdentifiers.VerticalViewSizeProperty,
+					currentPattern.Current.VerticalViewSize,
+					currentPattern.Current.VerticalViewSize,
+					currentPattern.Current.VerticalViewSize);
+			}
+		}
+				
+		[Test]
+		public void TransformPatternTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (TransformPattern.Pattern);
+			request.Add (TransformPattern.CanMoveProperty);
+			request.Add (TransformPattern.CanResizeProperty);
+			request.Add (TransformPattern.CanRotateProperty);
+
+			using (request.Activate ()) {
+				AutomationElement testFormElementRef2 = testFormElement.GetUpdatedCache (request);
+				TransformPattern currentPattern = (TransformPattern) testFormElement.GetCurrentPattern (TransformPattern.Pattern);
+				TransformPattern cachedPattern = (TransformPattern) testFormElementRef2.GetCachedPattern (TransformPattern.Pattern);
+
+				Assert.AreEqual (cachedPattern.Cached.CanMove,
+					currentPattern.Current.CanMove,
+					"Cached.CanMove == Current.CanMove");
+				VerifyCachedPropertyValue (testFormElementRef2,
+					TransformPatternIdentifiers.CanMoveProperty,
+					currentPattern.Current.CanMove,
+					currentPattern.Current.CanMove,
+					currentPattern.Current.CanMove);
+
+				Assert.AreEqual (cachedPattern.Cached.CanResize,
+					currentPattern.Current.CanResize,
+					"Cached.CanResize == Current.CanResize");
+				VerifyCachedPropertyValue (testFormElementRef2,
+					TransformPatternIdentifiers.CanResizeProperty,
+					currentPattern.Current.CanResize,
+					currentPattern.Current.CanResize,
+					currentPattern.Current.CanResize);
+
+				Assert.AreEqual (cachedPattern.Cached.CanRotate,
+					currentPattern.Current.CanRotate,
+					"Cached.CanRotate == Current.CanRotate");
+				VerifyCachedPropertyValue (testFormElementRef2,
+					TransformPatternIdentifiers.CanRotateProperty,
+					currentPattern.Current.CanRotate,
+					currentPattern.Current.CanRotate,
+					currentPattern.Current.CanRotate);
+			}
+		}
+				
+		[Test]
+		public void ValuePatternTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (ValuePattern.Pattern);
+			request.Add (ValuePattern.IsReadOnlyProperty);
+			request.Add (ValuePattern.ValueProperty);
+
+			using (request.Activate ()) {
+				AutomationElement textbox1ElementRef2 = textbox1Element.GetUpdatedCache (request);
+				ValuePattern currentPattern = (ValuePattern) textbox1Element.GetCurrentPattern (ValuePattern.Pattern);
+				ValuePattern cachedPattern = (ValuePattern) textbox1ElementRef2.GetCachedPattern (ValuePattern.Pattern);
+
+				Assert.AreEqual (cachedPattern.Cached.IsReadOnly,
+					currentPattern.Current.IsReadOnly,
+					"Cached.IsReadOnly == Current.IsReadOnly");
+				VerifyCachedPropertyValue (textbox1ElementRef2,
+					ValuePatternIdentifiers.IsReadOnlyProperty,
+					currentPattern.Current.IsReadOnly,
+					currentPattern.Current.IsReadOnly,
+					currentPattern.Current.IsReadOnly);
+
+				Assert.AreEqual (cachedPattern.Cached.Value,
+					currentPattern.Current.Value,
+					"Cached.Value == Current.Value");
+				VerifyCachedPropertyValue (textbox1ElementRef2,
+					ValuePatternIdentifiers.ValueProperty,
+					currentPattern.Current.Value,
+					currentPattern.Current.Value,
+					currentPattern.Current.Value);
+			}
+		}
+				
+		[Test]
+		public void WindowPatternTest ()
+		{
+			var request = new CacheRequest ();
+			request.Add (WindowPattern.Pattern);
+			request.Add (WindowPattern.CanMaximizeProperty);
+			request.Add (WindowPattern.CanMinimizeProperty);
+			request.Add (WindowPattern.IsModalProperty);
+			request.Add (WindowPattern.IsTopmostProperty);
+			request.Add (WindowPattern.WindowInteractionStateProperty);
+			request.Add (WindowPattern.WindowVisualStateProperty);
+
+			using (request.Activate ()) {
+				AutomationElement testFormElementRef2 = testFormElement.GetUpdatedCache (request);
+				WindowPattern currentPattern = (WindowPattern) testFormElement.GetCurrentPattern (WindowPattern.Pattern);
+				WindowPattern cachedPattern = (WindowPattern) testFormElementRef2.GetCachedPattern (WindowPattern.Pattern);
+
+				Assert.AreEqual (cachedPattern.Cached.CanMaximize,
+					currentPattern.Current.CanMaximize,
+					"Cached.CanMaximize == Current.CanMaximize");
+				VerifyCachedPropertyValue (testFormElementRef2,
+					WindowPatternIdentifiers.CanMaximizeProperty,
+					currentPattern.Current.CanMaximize,
+					currentPattern.Current.CanMaximize,
+					currentPattern.Current.CanMaximize);
+
+				Assert.AreEqual (cachedPattern.Cached.CanMinimize,
+					currentPattern.Current.CanMinimize,
+					"Cached.CanMinimize == Current.CanMinimize");
+				VerifyCachedPropertyValue (testFormElementRef2,
+					WindowPatternIdentifiers.CanMinimizeProperty,
+					currentPattern.Current.CanMinimize,
+					currentPattern.Current.CanMinimize,
+					currentPattern.Current.CanMinimize);
+
+				Assert.AreEqual (cachedPattern.Cached.IsModal,
+					currentPattern.Current.IsModal,
+					"Cached.IsModal == Current.IsModal");
+				VerifyCachedPropertyValue (testFormElementRef2,
+					WindowPatternIdentifiers.IsModalProperty,
+					currentPattern.Current.IsModal,
+					currentPattern.Current.IsModal,
+					currentPattern.Current.IsModal);
+
+				Assert.AreEqual (cachedPattern.Cached.IsTopmost,
+					currentPattern.Current.IsTopmost,
+					"Cached.IsTopmost == Current.IsTopmost");
+				VerifyCachedPropertyValue (testFormElementRef2,
+					WindowPatternIdentifiers.IsTopmostProperty,
+					currentPattern.Current.IsTopmost,
+					currentPattern.Current.IsTopmost,
+					currentPattern.Current.IsTopmost);
+
+				Assert.AreEqual (cachedPattern.Cached.WindowInteractionState,
+					currentPattern.Current.WindowInteractionState,
+					"Cached.WindowInteractionState == Current.WindowInteractionState");
+				VerifyCachedPropertyValue (testFormElementRef2,
+					WindowPatternIdentifiers.WindowInteractionStateProperty,
+					currentPattern.Current.WindowInteractionState,
+					currentPattern.Current.WindowInteractionState,
+					currentPattern.Current.WindowInteractionState);
+
+				Assert.AreEqual (cachedPattern.Cached.WindowVisualState,
+					currentPattern.Current.WindowVisualState,
+					"Cached.WindowVisualState == Current.WindowVisualState");
+				VerifyCachedPropertyValue (testFormElementRef2,
+					WindowPatternIdentifiers.WindowVisualStateProperty,
+					currentPattern.Current.WindowVisualState,
+					currentPattern.Current.WindowVisualState,
+					currentPattern.Current.WindowVisualState);
+			}
+		}
+				
+		private void TestSimpleProperty (AutomationElement element, AutomationProperty property)
+		{
+			var request = new CacheRequest ();
+			request.Add (property);
+			using (request.Activate ()) {
+				AutomationElement cachedElement = element.GetUpdatedCache (request);
+				object currentValue = element.GetCurrentPropertyValue (property);
+				Assert.AreEqual (currentValue,
+					cachedElement.GetCachedPropertyValue (property),
+					"GetcachedPropertyValue " + property.ProgrammaticName);
+			}
+		}
+
+		private void VerifyCachedPropertyValue (AutomationElement element, AutomationProperty property, object expectedTrue, object expectedFalse, object expectedDefault)
+		{
+			Assert.AreEqual (expectedTrue,
+				element.GetCachedPropertyValue (property, true),
+				property.ProgrammaticName + " w/ true");
+			Assert.AreEqual (expectedFalse,
+				element.GetCachedPropertyValue (property, false),
+				property.ProgrammaticName + " w/ false");
+			Assert.AreEqual (expectedDefault,
+				element.GetCachedPropertyValue (property),
+				property.ProgrammaticName + " w/ default");
+		}
+
+		private void VerifyCachedPropertyValue<T> (AutomationElement element, AutomationProperty property, object expected)
+		{
+			//T retval = (T)
+				//element.GetCachedPropertyValue (property, true);
+			//Assert.AreEqual (expected, retval,
+				//property.ProgrammaticName + " w/ true");
+			//retval = (T)
+				//element.GetCachedPropertyValue (property, false);
+			//Assert.AreEqual (expected, retval,
+				//property.ProgrammaticName + " w/ false");
+			object retval =
+				element.GetCachedPropertyValue (property);
+			Assert.AreEqual (expected, retval,
+				property.ProgrammaticName + " w/ default");
+		}
+
+		private void PropertyChangedHandler (object sender, AutomationPropertyChangedEventArgs e)
+		{
+			AutomationElement element = sender as AutomationElement;
+			if (element.Current.ControlType != ControlType.Text)
+				return;
+			eventElement = element;
+			eventCount++;
+		}
+	}
+}
diff --git a/UIAutomationClientTests/UIAutomationClientTests/ConditionTest.cs b/UIAutomationClientTests/UIAutomationClientTests/ConditionTest.cs
new file mode 100644
index 0000000..d98dcf9
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/ConditionTest.cs
@@ -0,0 +1,471 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//      Sandy Armstrong <sanfordarmstrong at gmail.com>
+// 
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Windows;
+using System.Windows.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+
+using NUnit.Framework;
+
+namespace MonoTests.System.Windows.Automation
+{
+	[TestFixture]
+	public class ConditionTest : BaseTest
+	{
+		[Test]
+		public void TrueConditionTest ()
+		{
+			Condition trueCond = Condition.TrueCondition;
+			Assert.IsNotNull (trueCond, "TrueCondition");
+
+			PropertyCondition truePropCond = trueCond as PropertyCondition;
+			Assert.IsNull (truePropCond, "TrueCondition is not a PropertyCondition");
+
+			AndCondition trueAndCond = trueCond as AndCondition;
+			Assert.IsNull (trueAndCond, "TrueCondition is not a AndCondition");
+
+			OrCondition trueOrCond = trueCond as OrCondition;
+			Assert.IsNull (trueOrCond, "TrueCondition is not a OrCondition");
+
+			NotCondition trueNotCond = trueCond as NotCondition;
+			Assert.IsNull (trueNotCond, "TrueCondition is not a NotCondition");
+		}
+
+		[Test]
+		public void FalseConditionTest ()
+		{
+			Condition falseCond = Condition.FalseCondition;
+			Assert.IsNotNull (falseCond, "FalseCondition");
+
+			PropertyCondition falsePropCond = falseCond as PropertyCondition;
+			Assert.IsNull (falsePropCond, "FalseCondition is not a PropertyCondition");
+
+			AndCondition falseAndCond = falseCond as AndCondition;
+			Assert.IsNull (falseAndCond, "FalseCondition is not a AndCondition");
+
+			OrCondition falseOrCond = falseCond as OrCondition;
+			Assert.IsNull (falseOrCond, "FalseCondition is not a OrCondition");
+
+			NotCondition falseNotCond = falseCond as NotCondition;
+			Assert.IsNull (falseNotCond, "FalseCondition is not a NotCondition");
+		}
+
+		[Test]
+		public void PropertyConditionTest ()
+		{
+			AssertRaises<ArgumentNullException> (
+				() => new PropertyCondition (null, null),
+				"passing null to both params of PropertyCondition constructor");
+
+			//Load for everything in AEIds
+			VerifyPropertyConditionBasics (AEIds.AcceleratorKeyProperty,
+				new object [] { string.Empty, null },
+				new object [] { 5 });
+			VerifyPropertyConditionBasics (AEIds.AccessKeyProperty,
+				new object [] { string.Empty, null },
+				new object [] { true });
+			VerifyPropertyConditionBasics (AEIds.AutomationIdProperty,
+				new object [] { string.Empty, null },
+				new object [] { true });
+			VerifyPropertyConditionBasics (AEIds.BoundingRectangleProperty,
+				new object [] { Rect.Empty },
+				new object [] { null, true },
+				new object [] { new double [] { double.PositiveInfinity, double.PositiveInfinity, double.NegativeInfinity, double.NegativeInfinity } });
+			VerifyPropertyConditionBasics (AEIds.ClassNameProperty,
+				new object [] { string.Empty, null },
+				new object [] { true });
+			VerifyPropertyConditionBasics (AEIds.ClickablePointProperty,
+			        new object [] { new Point (0, 0) },
+			        new object [] { null, true },
+				new object [] { new double [] {0, 0} });
+			VerifyPropertyConditionBasics (AEIds.ControlTypeProperty,
+				new object [] { ControlType.Button, null },
+				new object [] { ControlType.Button.Id, string.Empty },
+				new object [] { ControlType.Button.Id, null });
+			VerifyPropertyConditionBasics (AEIds.CultureProperty,
+				new object [] { new CultureInfo ("en-US"), new CultureInfo ("fr-FR"), null },
+				new object [] { new CultureInfo ("en-US").LCID, "en-US", string.Empty, 5 },
+				new object [] { new CultureInfo ("en-US").LCID, new CultureInfo ("fr-FR").LCID, null });
+			VerifyPropertyConditionBasics (AEIds.FrameworkIdProperty,
+				new object [] { "WinForm", string.Empty, "hiya", null },
+				new object [] { 5 });
+			VerifyPropertyConditionBasics (AEIds.HasKeyboardFocusProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.HelpTextProperty,
+				new object [] { string.Empty, null },
+				new object [] { true });
+			VerifyPropertyConditionBasics (AEIds.IsContentElementProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsControlElementProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsDockPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsEnabledProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsExpandCollapsePatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsGridItemPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsGridPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsInvokePatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsKeyboardFocusableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsMultipleViewPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsOffscreenProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsPasswordProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsRangeValuePatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsRequiredForFormProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsScrollItemPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsScrollPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsSelectionItemPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsSelectionPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsTableItemPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsTablePatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsTextPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsTogglePatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsTransformPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsValuePatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.IsWindowPatternAvailableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (AEIds.ItemStatusProperty,
+				new object [] { string.Empty, null },
+				new object [] { true });
+			VerifyPropertyConditionBasics (AEIds.ItemTypeProperty,
+				new object [] { string.Empty, null },
+				new object [] { true });
+			VerifyPropertyConditionBasics (AEIds.LabeledByProperty,
+				new object [] { button1Element, null },
+				new object [] { string.Empty, true },
+				new object [] { button1Element.GetRuntimeId (), null });
+			VerifyPropertyConditionBasics (AEIds.LocalizedControlTypeProperty,
+				new object [] { string.Empty, null },
+				new object [] { true });
+			VerifyPropertyConditionBasics (AEIds.NameProperty,
+				new object [] { string.Empty, null },
+				new object [] { true });
+			VerifyPropertyConditionBasics (AEIds.NativeWindowHandleProperty,
+				new object [] { 5 },
+				new object [] { null, string.Empty, true });
+			VerifyPropertyConditionBasics (AEIds.OrientationProperty,
+				new object [] { OrientationType.Horizontal },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (AEIds.ProcessIdProperty,
+				new object [] { 5 },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (AEIds.RuntimeIdProperty,
+				new object [] { new int [] { 5, 6, 7 }, null },
+				new object [] { true });
+
+			// Load everything for *PatternIdentifiers
+			VerifyPropertyConditionBasics (DockPatternIdentifiers.DockPositionProperty,
+				new object [] { DockPosition.Bottom },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty,
+				new object [] { ExpandCollapseState.Collapsed },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (GridItemPatternIdentifiers.ColumnProperty,
+				new object [] { 5, -5 },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (GridItemPatternIdentifiers.ColumnSpanProperty,
+				new object [] { 5, -5 },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (GridItemPatternIdentifiers.ContainingGridProperty,
+				new object [] { button1Element, null },
+				new object [] { true },
+				new object [] { button1Element.GetRuntimeId (), null });
+			VerifyPropertyConditionBasics (GridItemPatternIdentifiers.RowProperty,
+				new object [] { 5, -5 },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (GridItemPatternIdentifiers.RowSpanProperty,
+				new object [] { 5, -5 },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (GridPatternIdentifiers.ColumnCountProperty,
+				new object [] { 5, -5 },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (GridPatternIdentifiers.RowCountProperty,
+				new object [] { 5, -5 },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (MultipleViewPatternIdentifiers.CurrentViewProperty,
+				new object [] { 5, -5 },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (MultipleViewPatternIdentifiers.SupportedViewsProperty,
+				new object [] { new int [] { 5, -5 }, new int [] { }, null },
+				new object [] { true });
+			VerifyPropertyConditionBasics (RangeValuePatternIdentifiers.IsReadOnlyProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (RangeValuePatternIdentifiers.LargeChangeProperty,
+				new object [] { 5.0, -5.0, 1.2 },
+				new object [] { null, 5, -5, true });
+			VerifyPropertyConditionBasics (RangeValuePatternIdentifiers.MaximumProperty,
+				new object [] { 5.0, -5.0, 1.2, 5, -5, true, string.Empty, null },
+				new object [] { });
+			VerifyPropertyConditionBasics (RangeValuePatternIdentifiers.MinimumProperty,
+				new object [] { 5.0, -5.0, 1.2, 5, -5, true, string.Empty, null },
+				new object [] { });
+			VerifyPropertyConditionBasics (RangeValuePatternIdentifiers.SmallChangeProperty,
+				new object [] { 5.0, -5.0, 1.2 },
+				new object [] { null, 5, -5, true });
+			VerifyPropertyConditionBasics (RangeValuePatternIdentifiers.ValueProperty,
+				new object [] { 5.0, -5.0, 1.2 },
+				new object [] { null, 5, -5, true });
+			VerifyPropertyConditionBasics (ScrollPatternIdentifiers.HorizontallyScrollableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (ScrollPatternIdentifiers.HorizontalScrollPercentProperty,
+				new object [] { 5.0, -5.0, 1.2 },
+				new object [] { null, 5, -5, true });
+			VerifyPropertyConditionBasics (ScrollPatternIdentifiers.HorizontalViewSizeProperty,
+				new object [] { 5.0, -5.0, 1.2 },
+				new object [] { null, 5, -5, true });
+			VerifyPropertyConditionBasics (ScrollPatternIdentifiers.VerticallyScrollableProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (ScrollPatternIdentifiers.VerticalScrollPercentProperty,
+				new object [] { 5.0, -5.0, 1.2 },
+				new object [] { null, 5, -5, true });
+			VerifyPropertyConditionBasics (ScrollPatternIdentifiers.VerticalViewSizeProperty,
+				new object [] { 5.0, -5.0, 1.2 },
+				new object [] { null, 5, -5, true });
+			VerifyPropertyConditionBasics (SelectionItemPatternIdentifiers.IsSelectedProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (SelectionItemPatternIdentifiers.SelectionContainerProperty,
+				new object [] { button1Element, null },
+				new object [] { true },
+				new object [] { button1Element.GetRuntimeId (), null });
+			VerifyPropertyConditionBasics (SelectionPatternIdentifiers.CanSelectMultipleProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (SelectionPatternIdentifiers.IsSelectionRequiredProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (SelectionPatternIdentifiers.SelectionProperty,
+				new object [] { new AutomationElement [] { button1Element }, null },
+				new object [] { button1Element, true });
+			VerifyPropertyConditionBasics (TableItemPatternIdentifiers.ColumnHeaderItemsProperty,
+				new object [] { new AutomationElement [] { button1Element }, null },
+				new object [] { button1Element, true });
+			VerifyPropertyConditionBasics (TableItemPatternIdentifiers.RowHeaderItemsProperty,
+				new object [] { new AutomationElement [] { button1Element }, null },
+				new object [] { button1Element, true });
+			VerifyPropertyConditionBasics (TablePatternIdentifiers.ColumnHeadersProperty,
+				new object [] { new AutomationElement [] { button1Element }, null },
+				new object [] { button1Element, true });
+			VerifyPropertyConditionBasics (TablePatternIdentifiers.RowHeadersProperty,
+				new object [] { new AutomationElement [] { button1Element }, null },
+				new object [] { button1Element, true });
+			VerifyPropertyConditionBasics (TablePatternIdentifiers.RowOrColumnMajorProperty,
+				new object [] { RowOrColumnMajor.ColumnMajor, AutomationElement.NotSupported },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (TogglePatternIdentifiers.ToggleStateProperty,
+				new object [] { ToggleState.Indeterminate },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (TransformPatternIdentifiers.CanMoveProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (TransformPatternIdentifiers.CanResizeProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (TransformPatternIdentifiers.CanRotateProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (ValuePatternIdentifiers.IsReadOnlyProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (ValuePatternIdentifiers.ValueProperty,
+				new object [] { string.Empty, null },
+				new object [] { 5, true });
+			VerifyPropertyConditionBasics (WindowPatternIdentifiers.CanMaximizeProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (WindowPatternIdentifiers.CanMinimizeProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (WindowPatternIdentifiers.IsModalProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (WindowPatternIdentifiers.IsTopmostProperty,
+				new object [] { true },
+				new object [] { null, string.Empty });
+			VerifyPropertyConditionBasics (WindowPatternIdentifiers.WindowInteractionStateProperty,
+				new object [] { WindowInteractionState.BlockedByModalWindow },
+				new object [] { null, true });
+			VerifyPropertyConditionBasics (WindowPatternIdentifiers.WindowVisualStateProperty,
+				new object [] { WindowVisualState.Maximized },
+				new object [] { null, true });
+
+			Assert.IsNotNull (button1Element.FindFirst (TreeScope.Element,
+				new PropertyCondition (AEIds.NameProperty, "button1")));
+			Assert.IsNull (button1Element.FindFirst (TreeScope.Element,
+				new PropertyCondition (AEIds.NameProperty, "Button1")));
+			Assert.IsNull (button1Element.FindFirst (TreeScope.Element,
+				new PropertyCondition (AEIds.NameProperty, "Button1", PropertyConditionFlags.None)));
+			Assert.IsNotNull (button1Element.FindFirst (TreeScope.Element,
+				new PropertyCondition (AEIds.NameProperty, "Button1", PropertyConditionFlags.IgnoreCase)));
+
+			PropertyCondition cond1 = new PropertyCondition (AEIds.NameProperty,
+				string.Empty);
+			PropertyCondition cond2 = new PropertyCondition (AEIds.NameProperty,
+				string.Empty);
+			Assert.AreNotEqual (cond1, cond2);
+		}
+
+		private void VerifyPropertyConditionBasics (AutomationProperty property,
+			object [] expectedGoodValues,
+			object [] expectedBadValues)
+		{
+			VerifyPropertyConditionBasics (property,
+				expectedGoodValues,
+				expectedBadValues,
+				expectedGoodValues);
+		}
+
+		private void VerifyPropertyConditionBasics (AutomationProperty property,
+			object [] expectedGoodValues,
+			object [] expectedBadValues,
+			object [] expectedGoodValuePropValues)
+		{
+			Assert.AreEqual (expectedGoodValues.Length,
+				expectedGoodValuePropValues.Length,
+				"Cannot test PropertyConditon Value property if expectedGoodValues.Length != expectedGoodValuePropValues.Length");
+
+			List<object> goodVals = new List<object> (expectedGoodValues);
+			goodVals.Add (AutomationElement.NotSupported);
+
+			List<object> goodValPropVals = new List<object> (expectedGoodValuePropValues);
+			goodValPropVals.Add (AutomationElement.NotSupported);
+
+			for (int i = 0; i < goodVals.Count; i++) {
+				object val = goodVals [i];
+				object expectedPropVal = goodValPropVals [i];
+
+				VerifyPropertyConditionConstructor (property,
+					val,
+					expectedPropVal,
+					null);
+				VerifyPropertyConditionConstructor (property,
+					val,
+					expectedPropVal,
+					PropertyConditionFlags.None);
+				VerifyPropertyConditionConstructor (property,
+					val,
+					expectedPropVal,
+					PropertyConditionFlags.IgnoreCase);
+			}
+
+			foreach (object val in expectedBadValues) {
+				AssertRaises<ArgumentException> (
+					() => new PropertyCondition (property, val),
+					string.Format ("using '{0}' as value for {1}",
+				                        val ?? "(null)",
+				                        property.ProgrammaticName));
+			}
+		}
+
+		private void VerifyPropertyConditionConstructor (AutomationProperty property,
+			object val,
+			object expectedPropVal,
+			PropertyConditionFlags? flags)
+		{
+			bool exceptionRaised = false;
+			bool ignoreCaseAllowed = val is string;
+			bool exceptionExpected = flags.HasValue &&
+				flags.Value == PropertyConditionFlags.IgnoreCase &&
+				!ignoreCaseAllowed;
+			try {
+				PropertyCondition cond;
+				if (flags.HasValue)
+					cond = new PropertyCondition (property, val, flags.Value);
+				else
+					cond = new PropertyCondition (property, val);
+				Assert.AreEqual (property, cond.Property,
+					"PropertyCondition.Property");
+				Assert.AreEqual (expectedPropVal, cond.Value,
+					"PropertyCondition.Value for " +
+					property.ProgrammaticName);
+				Assert.AreEqual (flags.HasValue ? flags.Value : PropertyConditionFlags.None,
+					cond.Flags,
+					"PropertyCondition.Flags");
+			} catch (ArgumentException) {
+				exceptionRaised = true;
+			}
+			Assert.AreEqual (exceptionExpected,
+				exceptionRaised,
+				string.Format ("For {0} expected '{1}' with {2} to be a {3}",
+					property.ProgrammaticName,
+					val ?? "(null)",
+					flags.HasValue ? flags.Value.ToString () : "no flag specified",
+					exceptionExpected ? "bad value" : "good value, but instead received ArgumentException"));
+		}
+	}
+}
diff --git a/UIAutomationProvider/System.Windows.Automation.Provider/ITextProvider.cs b/UIAutomationClientTests/UIAutomationClientTests/CustomControlTest.cs
similarity index 51%
copy from UIAutomationProvider/System.Windows.Automation.Provider/ITextProvider.cs
copy to UIAutomationClientTests/UIAutomationClientTests/CustomControlTest.cs
index 8e8ea08..4226645 100644
--- a/UIAutomationProvider/System.Windows.Automation.Provider/ITextProvider.cs
+++ b/UIAutomationClientTests/UIAutomationClientTests/CustomControlTest.cs
@@ -17,29 +17,49 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
 // 
-// Copyright (c) 2008 Novell, Inc. (http://www.novell.com) 
+// Copyright (c) 2010 Novell, Inc. (http://www.novell.com) 
 // 
 // Authors: 
-//      Calvin Gaisford <calvinrg at gmail.com>
-// 
+//  Matt Guo <matt at mattguo.com>
+//
 
-using System.Runtime.InteropServices;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
 using System.Windows;
 using System.Windows.Automation;
 
-namespace System.Windows.Automation.Provider
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+
+using NUnit.Framework;
+
+namespace MonoTests.System.Windows.Automation
 {
-	[Guid ("3589c92c-63f3-4367-99bb-ada653b77cf2")]
-	[InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
-	[ComVisible (true)]
-	public interface ITextProvider
+	[TestFixture]
+	public class CustomControlTest : BaseTest
 	{
-		ITextRangeProvider DocumentRange { get; }
-		SupportedTextSelection SupportedTextSelection { get; }
+		private AutomationElement myControlElement;
 
-		ITextRangeProvider[] GetSelection ();
-		ITextRangeProvider[] GetVisibleRanges ();
-		ITextRangeProvider RangeFromChild (IRawElementProviderSimple childElement);
-		ITextRangeProvider RangeFromPoint (Point screenLocation);
+		protected override void CustomFixtureSetUp ()
+		{
+			base.CustomFixtureSetUp ();
+			if (!Atspi) {
+				myControlElement = testFormElement.FindFirst (TreeScope.Children,
+					new PropertyCondition (AEIds.NameProperty, "My Control"));
+				Assert.IsNotNull (myControlElement, "myControlElement is not null");
+			}
+		}
+
+		[Test]
+		public void PropertyTest ()
+		{
+			if (!Atspi) {
+				Assert.AreEqual ("My Control", myControlElement.Current.Name);
+				Assert.AreEqual (ControlType.Pane.ProgrammaticName, myControlElement.Current.ControlType.ProgrammaticName);
+				Assert.AreEqual (new Size (30.0, 15.0), myControlElement.Current.BoundingRectangle.Size);
+			}
+		}
 	}
 }
+
diff --git a/UIAutomationClientTests/UIAutomationClientTests/DataItemTest.cs b/UIAutomationClientTests/UIAutomationClientTests/DataItemTest.cs
new file mode 100644
index 0000000..ce34aa3
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/DataItemTest.cs
@@ -0,0 +1,71 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2010 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Matt Guo <matt at mattguo.com>
+// 
+
+using System;
+using System.Threading;
+using System.Collections.Generic;
+using System.Windows.Automation;
+using System.Windows.Automation.Provider;
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+using NUnit.Framework;
+using At = System.Windows.Automation.Automation;
+using SW = System.Windows;
+
+namespace MonoTests.System.Windows.Automation
+{
+	[TestFixture]
+	public class DataItemTest : BaseTest
+	{
+		[Test]
+		public void Bug584340 ()
+		{
+			// Bug summary: In ListView, Calling ValuePattern.SetValue on one cell can take effect on another sibling cell Winforms.
+			var aliceElement = table1Element.FindFirst (TreeScope.Descendants,
+				new PropertyCondition (AEIds.NameProperty, "Alice"));
+			var _24Element = TreeWalker.RawViewWalker.GetNextSibling (aliceElement);
+			Assert.AreEqual ("24", _24Element.Current.Name);
+		}
+
+		[Test]
+		public void Bug586635 ()
+		{
+			// Bug summary: The NameProperty of DataGridView's Cell is not correctly returned.
+			var item0Element = listView1Element.FindFirst (TreeScope.Descendants,
+				new AndCondition (new PropertyCondition (AEIds.NameProperty, "Item 0"),
+					new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Edit)));
+			var subItem1Element = listView1Element.FindFirst (TreeScope.Descendants,
+				new AndCondition (new PropertyCondition (AEIds.NameProperty, "subitem1"),
+					new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Edit)));
+			var vp = (ValuePattern) subItem1Element.GetCurrentPattern (ValuePattern.Pattern);
+			vp.SetValue ("New Sub");
+			Assert.AreEqual ("Item 0", item0Element.Current.Name);
+			Assert.AreEqual ("New Sub", subItem1Element.Current.Name);
+			vp = (ValuePattern) item0Element.GetCurrentPattern (ValuePattern.Pattern);
+			vp.SetValue ("New Item Val");
+			Assert.AreEqual ("New Item Val", item0Element.Current.Name);
+			Assert.AreEqual ("New Sub", subItem1Element.Current.Name);
+		}
+	}
+}
diff --git a/UIAutomationClientTests/UIAutomationClientTests/DynamicElementTest.cs b/UIAutomationClientTests/UIAutomationClientTests/DynamicElementTest.cs
new file mode 100644
index 0000000..b6c3d1a
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/DynamicElementTest.cs
@@ -0,0 +1,95 @@
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2010 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Matt Guo <matt at mattguo.com>
+// 
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using System.Windows.Automation;
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+using SW = System.Windows;
+using At = System.Windows.Automation.Automation;
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace MonoTests.System.Windows.Automation
+{
+	[TestFixture]
+	public class DynamicElementTest : BaseTest
+	{
+		[Test]
+		public void AddRemoveElementTest ()
+		{
+			InvokePattern addAction = (InvokePattern) btnAddTextboxElement.GetCurrentPattern (InvokePattern.Pattern);
+			InvokePattern removeAction = (InvokePattern) btnRemoveTextboxElement.GetCurrentPattern (InvokePattern.Pattern);
+			addAction.Invoke ();
+			Thread.Sleep (1000);
+			var newEditElement = panel1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Edit));
+			var vp = (ValuePattern) newEditElement.GetCurrentPattern (ValuePattern.Pattern);
+			Action getControlTypeAction = () => Console.WriteLine (newEditElement.Current.BoundingRectangle);
+			Action appendDotAction = () => vp.SetValue (vp.Current.Value + ".");
+			AssertWontRaise<Exception> (getControlTypeAction, "get control type");
+			AssertWontRaise<Exception> (getControlTypeAction, "append '.'");
+			removeAction.Invoke ();
+			Thread.Sleep (1000);
+			AssertRaises<ElementNotAvailableException> (getControlTypeAction, "get control type");
+			AssertRaises<ElementNotAvailableException> (getControlTypeAction, "append '.'");
+		}
+
+		[Test]
+		public void Z_CloseAppTest ()
+		{
+			if (p != null) {
+				p.Kill ();
+				p = null;
+			}
+			AssertRaises<ElementNotAvailableException> (
+				() => Console.WriteLine (label1Element.Current.Name),
+				"get testFormElement.Name");
+			AssertRaises<ElementNotAvailableException> (
+				() => Console.WriteLine (testFormElement.Current.Name),
+				"get testFormElement.Name");
+		}
+
+		[Test]
+		public void DynamicPatternTest ()
+		{
+			var tp = (TransformPattern) testFormElement.GetCurrentPattern (TransformPattern.Pattern);
+			Action moveAction = () => tp.Move (25, 25);
+			AssertWontRaise<Exception> (moveAction, "move form");
+
+			//Disable the TransformPattern
+			RunCommand ("toggle form border");
+			AssertRaises<InvalidOperationException> (
+				() => testFormElement.GetCurrentPattern (TransformPattern.Pattern),
+				"get TransformPattern on a borderless form");
+			AssertRaises<InvalidOperationException> (moveAction, "move form");
+
+			//Enable the TransformPattern again
+			RunCommand ("toggle form border");
+		}
+	}
+}
diff --git a/UIAutomationClientTests/UIAutomationClientTests/ExpandCollapsePatternTest.cs b/UIAutomationClientTests/UIAutomationClientTests/ExpandCollapsePatternTest.cs
new file mode 100644
index 0000000..a97fca8
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/ExpandCollapsePatternTest.cs
@@ -0,0 +1,140 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Mike Gorse <mgorse at novell.com>
+// 
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using System.Windows.Automation;
+using System.Linq;
+using At = System.Windows.Automation.Automation;
+
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+
+namespace MonoTests.System.Windows.Automation
+{
+	[TestFixture]
+	public class ExpandCollapsePatternTest : BaseTest
+	{
+		#region Test Methods
+		[Test]
+		public void ExpandCollapseTest ()
+		{
+			AutomationElement parentElement, childElement;
+			parentElement = treeView1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.TreeItem));
+			ExpandCollapsePattern pattern = (ExpandCollapsePattern) parentElement.GetCurrentPattern (ExpandCollapsePatternIdentifiers.Pattern);
+			ExpandCollapsePattern.ExpandCollapsePatternInformation current = pattern.Current;
+			Assert.AreEqual (ExpandCollapseState.Collapsed, current.ExpandCollapseState, "ExpandCollapseState before Expand");
+			pattern.Expand ();
+			if (Atspi)
+				Thread.Sleep (500);
+			Assert.AreEqual (ExpandCollapseState.Expanded, current.ExpandCollapseState, "ExpandCollapseState after Expand");
+			childElement = parentElement.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.TreeItem));
+			Assert.IsNotNull (childElement, "Should have a TreeItem after expand");
+
+			pattern.Collapse ();
+			if (Atspi)
+				Thread.Sleep (500);
+			Assert.AreEqual (ExpandCollapseState.Collapsed, current.ExpandCollapseState, "ExpandCollapseState after Collapse");
+		}
+
+		[Test]
+		[ExpectedException("System.Windows.Automation.ElementNotEnabledException")]
+		public void Z_NotEnabledTest ()
+		{
+			DisableControls ();
+
+			AutomationElement parentElement;
+			parentElement = treeView1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.TreeItem));
+			ExpandCollapsePattern pattern = (ExpandCollapsePattern) parentElement.GetCurrentPattern (ExpandCollapsePatternIdentifiers.Pattern);
+			ExpandCollapsePattern.ExpandCollapsePatternInformation current = pattern.Current;
+			Assert.AreEqual (ExpandCollapseState.Collapsed, current.ExpandCollapseState, "ExpandCollapseState before Collapse");
+			pattern.Expand ();
+		}
+
+		[Test]
+		public void Z_EventTest ()
+		{
+			AutomationElement parentElement;
+			parentElement = treeView1Element.FindFirst (TreeScope.Children,
+				new PropertyCondition (AEIds.ControlTypeProperty,
+					ControlType.TreeItem));
+			ExpandCollapsePattern pattern = (ExpandCollapsePattern) parentElement.GetCurrentPattern (ExpandCollapsePatternIdentifiers.Pattern);
+			pattern.Collapse ();
+			var propertyEventsArray = new [] {
+				new {Sender = (object) null, Args = (AutomationPropertyChangedEventArgs) null}};
+			var propertyEvents = propertyEventsArray.ToList ();
+			propertyEvents.Clear ();
+
+			AutomationPropertyChangedEventHandler propertyHandler =
+				(o, e) => propertyEvents.Add (new { Sender = o, Args = e });
+			At.AddAutomationPropertyChangedEventHandler (parentElement,
+			                                             TreeScope.Element, propertyHandler,
+			                                             ExpandCollapsePattern.ExpandCollapseStateProperty);
+
+			pattern.Expand ();
+			Thread.Sleep (100);
+			Assert.AreEqual (1, propertyEvents.Count, "event count");
+			Assert.AreEqual (parentElement, propertyEvents [0].Sender, "event sender");
+			Assert.AreEqual (ExpandCollapsePattern.ExpandCollapseStateProperty, propertyEvents [0].Args.Property, "property");
+			if (Atspi) {
+				Assert.AreEqual (ExpandCollapseState.Collapsed, propertyEvents [0].Args.OldValue, "old value");
+				Assert.AreEqual (ExpandCollapseState.Expanded, propertyEvents [0].Args.NewValue, "new value");
+			} else {
+				Assert.AreEqual (null, propertyEvents [0].Args.OldValue, "old value");
+				Assert.AreEqual (1, propertyEvents [0].Args.NewValue, "new value");
+			}
+
+			propertyEvents.Clear ();
+			pattern.Collapse ();
+			Thread.Sleep (100);
+			Assert.AreEqual (1, propertyEvents.Count, "event count");
+			Assert.AreEqual (parentElement, propertyEvents [0].Sender, "event sender");
+			Assert.AreEqual (ExpandCollapsePattern.ExpandCollapseStateProperty, propertyEvents [0].Args.Property, "property");
+			if (Atspi) {
+				Assert.AreEqual (ExpandCollapseState.Expanded, propertyEvents [0].Args.OldValue, "old value");
+				Assert.AreEqual (ExpandCollapseState.Collapsed, propertyEvents [0].Args.NewValue, "new value");
+			} else {
+				Assert.AreEqual (null, propertyEvents [0].Args.OldValue, "old value");
+				Assert.AreEqual (0, propertyEvents [0].Args.NewValue, "new value");
+			}
+
+			propertyEvents.Clear ();
+			pattern.Collapse ();
+			Thread.Sleep (100);
+			Assert.AreEqual (0, propertyEvents.Count, "event count when collapsing but already collapsed");
+		}
+		#endregion
+	}
+}
diff --git a/UIAutomationClientTests/UIAutomationClientTests/FocusTest.cs b/UIAutomationClientTests/UIAutomationClientTests/FocusTest.cs
new file mode 100644
index 0000000..db95360
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/FocusTest.cs
@@ -0,0 +1,121 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Matt Guo <matt at mattguo.com>
+// 
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using System.Windows.Automation;
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+using At = System.Windows.Automation.Automation;
+
+namespace MonoTests.System.Windows.Automation
+{
+	[TestFixture]
+	public class FocusTest : BaseTest
+	{
+		List<AutomationElement> actualFocusedElements = new List<AutomationElement> ();
+
+		[Test]
+		public void BasicFocusTest ()
+		{
+			// TODO:
+			//Currently FocusTest.BasicFocusTest can pass on Windows, but can't on Linux. The failure reason is that:
+			//on Windows, call InvokePattern.Invoke will make corresponding button focused, so we also assert this behavior in the test,
+			//however our implementation will not make the button focused after InvokePattern.Invoke.
+
+			AutomationElement [] expectedFocusedElements;
+			if (Atspi)
+				expectedFocusedElements = new AutomationElement [] {
+					btnRunElement, textbox3Element,
+					btnRunElement, button2Element,
+				};
+			else
+				expectedFocusedElements = new AutomationElement [] {
+					txtCommandElement, textbox3Element,
+					txtCommandElement, button2Element,
+				};
+
+			AutomationFocusChangedEventHandler handler = (s,e) => actualFocusedElements.Add ((AutomationElement) s);
+			At.AddAutomationFocusChangedEventHandler (handler);
+			RunCommand ("focus textBox3");
+			Assert.AreEqual (textbox3Element, AutomationElement.FocusedElement, "FocusedElement");
+			RunCommand ("focus button2");
+			Assert.AreEqual (button2Element, AutomationElement.FocusedElement, "FocusedElement");
+			At.RemoveAutomationFocusChangedEventHandler (handler);
+			RunCommand ("focus textBox3");
+			Assert.AreEqual (textbox3Element, AutomationElement.FocusedElement, "FocusedElement");
+
+			At.AddAutomationFocusChangedEventHandler (handler);
+			At.RemoveAllEventHandlers ();
+			RunCommand ("focus button2");
+			Assert.AreEqual (button2Element, AutomationElement.FocusedElement, "FocusedElement");
+
+			Assert.AreEqual (expectedFocusedElements.Length, actualFocusedElements.Count, "Event handler count");
+			for (int i = 0; i < actualFocusedElements.Count; i++) {
+				Assert.AreEqual (expectedFocusedElements [i], actualFocusedElements [i], "Event handler sender #" + i);
+			}
+		}
+
+		[Test]
+		public void SetFocusTest ()
+		{
+			AutomationElement [] expectedFocusedElements = new AutomationElement [] {
+				textbox3Element, button2Element
+			};
+
+			button2Element.SetFocus ();
+			AutomationFocusChangedEventHandler handler = (s,e) => actualFocusedElements.Add ((AutomationElement) s);
+			At.AddAutomationFocusChangedEventHandler (handler);
+			actualFocusedElements.Clear ();
+			textbox3Element.SetFocus ();
+			Thread.Sleep (100);
+			Assert.AreEqual (textbox3Element, AutomationElement.FocusedElement, "FocusedElement");
+			button2Element.SetFocus ();
+			Thread.Sleep (100);
+			Assert.AreEqual (button2Element, AutomationElement.FocusedElement, "FocusedElement");
+			Thread.Sleep(1000);
+			At.RemoveAutomationFocusChangedEventHandler (handler);
+			Assert.AreEqual (expectedFocusedElements.Length, actualFocusedElements.Count, "Event handler count");
+			for (int i = 0; i < actualFocusedElements.Count; i++) {
+				Assert.AreEqual (expectedFocusedElements [i], actualFocusedElements [i], "Event handler sender #" + i);
+			}
+		}
+
+		[Test]
+		public void AutomationFocusChangedEventArgsTest ()
+		{
+			var args = new AutomationFocusChangedEventArgs (0, 0);
+			Assert.AreEqual (AutomationElementIdentifiers.AutomationFocusChangedEvent,
+			                 args.EventId);
+		}
+
+		//todo need to write more test on multiple sources, after the focusedElement
+		//is supported by other sources such as Atspi
+	}
+}
diff --git a/UIAutomationClientTests/UIAutomationClientTests/InvokePatternTest.cs b/UIAutomationClientTests/UIAutomationClientTests/InvokePatternTest.cs
new file mode 100644
index 0000000..d66b346
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/InvokePatternTest.cs
@@ -0,0 +1,112 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2009 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Matt Guo <matt at mattguo.com>
+// 
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using System.Windows.Automation;
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+using NUnit.Framework;
+using MonoTests.System.Windows.Automation;
+using At = System.Windows.Automation.Automation;
+
+namespace MonoTests.System.Windows.Automation
+{
+
+	[TestFixture]
+	public class InvokePatternTest : BaseTest
+	{
+		#region Test Methods
+
+		[Test]
+		public void InvokeTest ()
+		{
+			int eventCount = 0;
+			AutomationEventHandler handler = (o, e) => eventCount++;
+			At.AddAutomationEventHandler (InvokePattern.InvokedEvent, button1Element,
+			                              TreeScope.Element, handler);
+
+			InvokePattern pattern = (InvokePattern) button1Element.GetCurrentPattern (InvokePattern.Pattern);
+			pattern.Invoke ();
+			if (Atspi)
+				Thread.Sleep (200);
+			Assert.AreEqual ("button1_click",
+				textbox1Element.GetCurrentPropertyValue (ValuePatternIdentifiers.ValueProperty),
+				"textBox1's text is modified after button1 is clicked");
+			Assert.AreEqual ("button1_click",
+				label1Element.GetCurrentPropertyValue (AutomationElementIdentifiers.NameProperty),
+				"label1's text is modified after button1 is clicked");
+			if (Atspi)
+				Assert.AreEqual (1, eventCount, "Invoke event fired");
+		}
+
+		[Test]
+		public void InvokeEventTest ()
+		{
+			int eventCount = 0;
+			AutomationEventHandler handler = (o, e) => eventCount++;
+			At.AddAutomationEventHandler (InvokePattern.InvokedEvent, button1Element,
+			                              TreeScope.Element, handler);
+
+			AssertRaises<ArgumentException> (
+				() => At.RemoveAutomationEventHandler (AutomationElementIdentifiers.AutomationPropertyChangedEvent, button1Element, handler),
+				"AutomationPropertyChangedEvent is not valid");
+
+			//Shall have no effect.
+			At.RemoveAutomationEventHandler (InvokePattern.InvokedEvent, testFormElement, handler);
+			RunCommand ("click button1");
+			Assert.AreEqual (1, eventCount, "Invoke event fired");
+
+			eventCount = 0;
+			At.RemoveAutomationEventHandler (InvokePattern.InvokedEvent, button1Element, handler);
+			RunCommand ("click button1");
+			Assert.AreEqual (0, eventCount, "Invoke event not fired");
+			eventCount = 0;
+			//Test for add the same handler again.
+			At.AddAutomationEventHandler (InvokePattern.InvokedEvent, button1Element,
+			                              TreeScope.Element, handler);
+			At.AddAutomationEventHandler (InvokePattern.InvokedEvent, button1Element,
+			                              TreeScope.Element, handler);
+			RunCommand ("click button1");
+			Assert.AreEqual (2, eventCount, "Invoke event fired");
+
+			eventCount = 0;
+			At.RemoveAllEventHandlers ();
+			RunCommand ("click button1");
+			Assert.AreEqual (0, eventCount, "Invoke event not fired");
+		}
+
+		[Test]
+		[ExpectedException("System.Windows.Automation.ElementNotEnabledException")]
+		public void NotEnabledTest ()
+		{
+			InvokePattern pattern = (InvokePattern) button3Element.GetCurrentPattern (InvokePatternIdentifiers.Pattern);
+			pattern.Invoke ();
+		}
+
+		#endregion
+	}
+}
diff --git a/UIAutomationClientTests/UIAutomationClientTests/LocalProviderTest.cs b/UIAutomationClientTests/UIAutomationClientTests/LocalProviderTest.cs
new file mode 100644
index 0000000..b040101
--- /dev/null
+++ b/UIAutomationClientTests/UIAutomationClientTests/LocalProviderTest.cs
@@ -0,0 +1,290 @@
+// Permission is hereby granted, free of charge, to any person obtaining 
+// a copy of this software and associated documentation files (the 
+// "Software"), to deal in the Software without restriction, including 
+// without limitation the rights to use, copy, modify, merge, publish, 
+// distribute, sublicense, and/or sell copies of the Software, and to 
+// permit persons to whom the Software is furnished to do so, subject to 
+// the following conditions: 
+//  
+// The above copyright notice and this permission notice shall be 
+// included in all copies or substantial portions of the Software. 
+//  
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+// 
+// Copyright (c) 2010 Novell, Inc. (http://www.novell.com) 
+// 
+// Authors: 
+//  Matt Guo <matt at mattguo.com>
+// 
+
+using System;
+using System.Threading;
+using System.Collections.Generic;
+using System.Windows.Automation;
+using System.Windows.Automation.Provider;
+using AEIds = System.Windows.Automation.AutomationElementIdentifiers;
+using NUnit.Framework;
+using At = System.Windows.Automation.Automation;
+using SW = System.Windows;
+
+namespace MonoTests.System.Windows.Automation
+{
+	[TestFixture]
+	public class LocalProviderTest
+	{
+		private AutomationElement child = null;
+		private AutomationElement root = null;
+		private CustomProviderFragment childProvider =null;
+		private CustomProviderRoot rootProvider =null;
+
+		[TestFixtureSetUp]
+		public virtual void FixtureSetUp ()
+		{
+			childProvider = new CustomProviderFragment (null);
+			rootProvider = new CustomProviderRoot(childProvider);
+			childProvider.Root = rootProvider;
+			child = AutomationElement.FromLocalProvider(childProvider);
+			root = AutomationElement.FromLocalProvider(rootProvider);
+		}
+
+		#region Test Methods
+		[Test]
+		public void PropertyTest ()
+		{
+			Assert.AreEqual ("Custom Simple", child.Current.Name);
+			Assert.AreEqual (ControlType.TabItem, child.Current.ControlType);
+			Assert.AreEqual ("Custom Root", root.Current.Name);
+			Assert.AreEqual (ControlType.Tab, root.Current.ControlType);
+		}
+
+		[Test]
+		public void PatternTest ()
+		{
+			childProvider.ClickCount = 0;
+			var ip = (InvokePattern) child.GetCurrentPattern (InvokePattern.Pattern);
+			ip.Invoke ();
+			Assert.AreEqual (1, childProvider.ClickCount);
+		}
+
+		[Test]
+		public void EventTest ()
+		{
+			int eventCount = 0;
+			AutomationEventHandler handler = (o, e) => eventCount++;
+			At.AddAutomationEventHandler (InvokePattern.InvokedEvent,
+				child, TreeScope.Element, handler);
+			childProvider.PerformInvoke ();
+			Thread.Sleep (500);
+			Assert.AreEqual (1, eventCount);
+		}
+
+		[Test]
+		public void ControlTreeTest ()
+		{
+			Assert.AreEqual (null, TreeWalker.RawViewWalker.GetParent (root), "root's parent");
+			Assert.AreEqual (child, TreeWalker.RawViewWalker.GetFirstChild (root), "root's first child");
+			Assert.AreEqual (child, TreeWalker.RawViewWalker.GetLastChild (root), "root's last child");
+			Assert.AreEqual (null, TreeWalker.RawViewWalker.GetPreviousSibling (root), "root's prev sibling");
+			Assert.AreEqual (null, TreeWalker.RawViewWalker.GetNextSibling (root), "root's next sibling");
+			Assert.AreEqual (child, root.FindFirst (TreeScope.Descendants, Condition.TrueCondition));
+			Assert.AreEqual (1,
+				root.FindAll (TreeScope.Descendants,
+					new PropertyCondition (AEIds.ControlTypeProperty, ControlType.TabItem)).Count,
+				"root's TabItem descendants");
+			Assert.AreEqual (0,
+				root.FindAll (TreeScope.Descendants,
+					new PropertyCondition (AEIds.ControlTypeProperty, ControlType.Button)).Count,
+				"root's Button descendants");
+
+			Assert.AreEqual (root, TreeWalker.RawViewWalker.GetParent (child), "child's parent");
+			Assert.AreEqual (null, TreeWalker.RawViewWalker.GetFirstChild (child), "child's first child");
+			Assert.AreEqual (null, TreeWalker.RawViewWalker.GetLastChild (child), "child's last child");
+			Assert.AreEqual (null, TreeWalker.RawViewWalker.GetPreviousSibling (child), "child's prev sibling");
+			Assert.AreEqual (null, TreeWalker.RawViewWalker.GetNextSibling (child), "child's next sibling");
+			Assert.AreEqual (0, child.FindAll (TreeScope.Descendants, Condition.TrueCondition).Count, "child's children count");
+		}
+		#endregion
+	}
+
+	internal class CustomProviderBase : IRawElementProviderFragment
+	{
+		private int[] runtimeId = null;
+		private SW.Rect rect = new SW.Rect (100.0, 100.0, 200.0, 200.0);
+
+		public CustomProviderBase (IRawElementProviderFragmentRoot root)
+		{
+			this.Root = root;
+		}
+
+		public IRawElementProviderFragmentRoot Root { get; set; }
+
+		#region IRawElementProviderFragment Members
+
+		public SW.Rect BoundingRectangle {
+			get { return rect; }
+		}
+
+		public IRawElementProviderFragmentRoot FragmentRoot {
+			get { return Root; }
+		}
+
+		public IRawElementProviderSimple[] GetEmbeddedFragmentRoots ()
+		{
+			return new IRawElementProviderSimple[0];
+		}
+
+		public int [] GetRuntimeId ()
+		{
+			const int CustomPrefix = 8888;
+			if (runtimeId == null) {
+				byte [] bytes = new Guid ().ToByteArray ();
+				runtimeId = new int [bytes.Length + 1];
+				runtimeId [0] = CustomPrefix;
+				for (int i = 0; i < bytes.Length; i++)
+					runtimeId [i + 1] = bytes [i];
+			}
+			return runtimeId;
+		}
+
+		public virtual IRawElementProviderFragment Navigate (NavigateDirection direction)
+		{
+			if (direction == NavigateDirection.Parent)
+				return Root;
+			else
+				return null;
+		}
+
+		public void SetFocus ()
+		{
+		}
+
+		#endregion
+
+		#region IRawElementProviderSimple Members
+
+		public virtual object GetPatternProvider (int patternId)
+		{
+			return null;
+		}
+
+		public virtual object GetPropertyValue (int propertyId)
+		{
+			return null;
+		}
+
+		public IRawElementProviderSimple HostRawElementProvider {
+			get { return null; }
+		}
+
+		public ProviderOptions ProviderOptions {
+			get { return ProviderOptions.ClientSideProvider; }
+		}
+
+		#endregion
+	}
+
+	internal class CustomProviderFragment : CustomProviderBase
+	{
+		public CustomProviderFragment (IRawElementProviderFragmentRoot root)
+			: base (root)
+		{
+			ClickCount = 0;
+		}
+
+		public int ClickCount { get; set; }
+
+		public void PerformInvoke ()
+		{
+			ClickCount++;
+			AutomationInteropProvider.RaiseAutomationEvent(InvokePattern.InvokedEvent, this,
+				new AutomationEventArgs(InvokePattern.InvokedEvent));
+		}
+
+		public override object GetPatternProvider (int patternId)
+		{
+			if (patternId == InvokePattern.Pattern.Id)
+				return new CustomInvokeProvider (this);
+			return base.GetPatternProvider (patternId);
+		}
+
+		public override object GetPropertyValue (int propertyId)
+		{
+			if (propertyId == AEIds.NameProperty.Id)
+				return "Custom Simple";
+			else if (propertyId == AEIds.ControlTypeProperty.Id)
+				return ControlType.TabItem.Id;
+			else
+				return base.GetPropertyValue (propertyId);
+		}
+	}
+
+	internal class CustomInvokeProvider